希望遇到相同問題的朋友少走彎路.........
調試問題的原因:
1、華爲WCDMA模塊正常工作後,如果啓用撥號腳本,則不管有無插SIM卡,都會成功映射出ppp0網卡。
2、但是沒有SIM卡時,過一會兒ppp0會自動被註銷,而有SIM卡則不會,而且沒有SIM卡時,即使加載了ppp0網卡,也不會分配IP地址。
3、所以通過簡單的判斷是否有ppp0的網卡存在無法正常檢測3G撥號是否成功;
4、此時採取檢測網卡ppp是否分配IP來檢測3G比好是否成功;
5、因爲getifaddrs()系統調用比ioctl()接口方便,所以先嚐試使用getifaddrs()去判斷,但奇怪的是:如果不獲取3G網卡的信息時,則eth0和lo兩個網卡都能正常,而只要去檢測ppp0網卡IP信息時,則系統會被自動重啓。所以不得不放棄getifaddrs()接口;
6、採用ioctl()去獲取ppp0接口的網卡的IP信息則正常。
第六部 方法函數原型如下:
int netGetIp(char *interface, unsigned int *ip)
{
int sockfd = -1;
struct ifreq ifr;
if((NULL == interface) || ('\0' == interface))
{
printf("get ip :interface == NULL\r\n");
return -1;
}
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, interface, IFNAMSIZ);
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd <= 0)
{
printf("get ip:sock error\n");
return -1;
}
((struct sockaddr_in *)&ifr.ifr_addr)->sin_family = PF_INET;
if(ioctl(sockfd, SIOCGIFADDR, &ifr) < 0)
{
printf("get ip ioctl error\n");
close(sockfd);
return -1;
}
else
{
*ip = ((struct sockaddr_sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr;
printf("ip is %s\n", inet_ntoa(((struct sockaddr_sockaddr_in *)&ifr.ifr_addr)->sin_addr));
}
close(sockfd);
return 0;
}