首页 编程 软件学院 查看内容

C/C++ 获得公网ip地址和内网ip

2015-4-23 13:25 3436 0

摘要: 获得公网ip: view plaincopy在CODE上查看代码片派生到我的代码片bool getPublicIp(string ip) { int sock; char **pptr = NULL; struct sockaddr_in destAddr; struct hostent *ptr = NULL; char destIP; so ...
关键词: nbsp struct ifconf return ifreq destAddr destIP 代码 sockfd pptr

获得公网ip:
[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
bool getPublicIp(string& ip)  
{  
    int    sock;  
    char **pptr = NULL;  
    struct sockaddr_in    destAddr;  
    struct hostent    *ptr = NULL;  
    char destIP[128];  
 
    sock = socket(AF_INET,SOCK_STREAM,0);  
    if( -1 == sock ){  
        perror("creat socket failed");  
        return false;  
    }  
    bzero((void *)&destAddr,sizeof(destAddr));  
    destAddr.sin_family = AF_INET;  
    destAddr.sin_port = htons(80);  
    ptr = gethostbyname("www.ip138.com");  
    if(NULL == ptr){  
        perror("gethostbyname error");  
        return false;  
    }  
    for(pptr=ptr->h_addr_list ; NULL != *pptr ; ++pptr){  
        inet_ntop(ptr->h_addrtype,*pptr,destIP,sizeof(destIP));  
        printf("addr:%s\n",destIP);  
        ip = destIP;  
        return true;  
    }  
    return true;  
}  
获得内网ip:
[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
int getlocalip(char* outip)  
{  
#ifndef WIN32  
    int i=0;  
    int sockfd;  
    struct ifconf ifconf;  
    char buf[512];  
    struct ifreq *ifreq;  
    char* ip;  
    //初始化ifconf  
    ifconf.ifc_len = 512;  
    ifconf.ifc_buf = buf;  
    strcpy(outip,"127.0.0.1");  
    if((sockfd = socket(AF_INET, SOCK_DGRAM, 0))<0)  
    {  
        return -1;  
    }  
    ioctl(sockfd, SIOCGIFCONF, &ifconf);    //获取所有接口信息  
    close(sockfd);  
    //接下来一个一个的获取IP地址  
    ifreq = (struct ifreq*)buf;  
    for(i=(ifconf.ifc_len/sizeof(struct ifreq)); i>0; i--)  
    {  
        ip = inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr);  
 
 
        if(strcmp(ip,"127.0.0.1")==0)  //排除127.0.0.1,继续下一个  
        {  
            ifreq++;  
            continue;  
        }  
    }  
    strcpy(outip,ip);  
    return 0;  
#else  
    return 0;  
#endif  
      

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋
发表评论

最新评论

返回顶部