linux下获取本机地址问题
/* edit from internet 返回1内网测试地址 2外网253测试地址 3外网地址 */ int CheckLocalIP() { int iRet = 0; int inet_sock; struct ifreq ifr; FILE *net_devs; char buf[1024]; char interface[32]; char ip[32]; int index; if (IsFlag != -1) return IsFlag; net_devs = fopen("/proc/net/dev", "r"); if(net_devs == NULL) { perror("Can't open /proc/net/dev for reading"); return -1; } inet_sock = socket(AF_INET, SOCK_DGRAM, 0); IsFlag = iRet; while(1) { memset(buf, '\0', sizeof(buf)); memset(interface, '\0', sizeof(interface)); memset(ip, '\0', sizeof(ip)); if(fscanf(net_devs, "%32s %1024[^\n]", interface, buf) <= 0) { break; } index = 0; while ( index<32 && interface[index] != ':' ) { index++; } if (index>=32) continue; interface[index] = '\0'; strcpy(ifr.ifr_name, interface); if (ioctl(inet_sock, SIOCGIFADDR, &ifr) >=0 ) { strcpy(ip, inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr)); printf("%s\n",ip); if (strcmp(ip, PRESERVICEIP) == 0)//253发布地址 { printf("%s|%s\n",ip, PRESERVICEIP); iRet = 2; IsFlag = 2; break; } if(strcmp(ip, SERVICEIPNEW) == 0)//外网地址 { printf("%s|%s\n",ip, SERVICEIPNEW); iRet = 3; IsFlag = 3; break; } if(strcmp(ip, LOCALTESTIP) == 0)//内网地址 { printf("%s|%s\n",ip, LOCALTESTIP); iRet = 1; IsFlag = 1; break; } //printf("%s:\t%s\n", interface, inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr)); } } close(inet_sock); fclose(net_devs); return iRet; }
由于获取IP可能会获取外网的IP,也可能获取到内网的192.168.XX的IP。所有这里弄了一个while,而且判断都是if没有else来判断当前IP的情况。他会直到获取IP为外网IP的时候才会去匹配到

浙公网安备 33010602011771号