華爲WCDMA撥號後,調用getifaddrs後導致系統重啓

希望遇到相同問題的朋友少走彎路.........


調試問題的原因:

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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章