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的时候才会去匹配到

posted @ 2013-02-22 01:47  vanishfan  阅读(377)  评论(0)    收藏  举报