| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
mx3y
10年前发布

C++在windows下获取本地主机ipv4地址和ipv6地址

C++在windows下获取本地主机ipv4地址和ipv6地址

#include <Winsock2.h>  #include <stdio.h>  #include <iostream>  #include <cstring>  #include<ws2tcpip.h>  #pragma comment(lib, "ws2_32.lib ")  //linking to the library  using namespace std;  int get_ip()  {      struct addrinfo *ailist, *aip;             struct addrinfo hint;             struct sockaddr_in6 *sinp6;       PHOSTENT hostinfo;      char hostname[255] = {0};      //主机名        char *port = "3294";                              //端口号      const char *addr;             int ilRc;      gethostname(hostname, sizeof(hostname));      if((hostinfo = gethostbyname(hostname)) == NULL)    //获得本地ipv4地址      {          errno = GetLastError();          fprintf(stderr,"gethostbyname Error:%d\n", errno);          return 1;      }      LPCSTR ip;      while(*(hostinfo->h_addr_list) != NULL)        //输出ipv4地址      {          ip = inet_ntoa(*(struct in_addr *) *hostinfo->h_addr_list);          printf("ipv4 addr = %s\n\n", ip);          hostinfo->h_addr_list++;      }      hint.ai_family = AF_INET6;                   /*  hint 的限定设置  */      hint.ai_socktype = SOCK_STREAM;     /*   这里可是设置 socket type    比如  SOCK——DGRAM */      hint.ai_flags = AI_PASSIVE;                    // flags 的标志很多  。常用的有AI_CANONNAME;      hint.ai_protocol = 0;                               /*  设置协议  一般为0,默认 */              hint.ai_addrlen = 0;                                /*  下面不可以设置,为0,或者为NULL  */      hint.ai_canonname = NULL;             hint.ai_addr = NULL;             hint.ai_next = NULL;      ilRc = getaddrinfo(hostname, port, &hint, &ailist);    /*通过主机名获得地址信息*/           if (ilRc < 0)             {                        char str_error[100];                         strcpy(str_error, (char *)gai_strerror(errno));                         printf("str_error = %s", str_error);                         return 0;             }      if(ailist == NULL)      {          printf("sorry not find the IP address,please try again \n");      }      for (aip = ailist; aip != NULL; aip = aip->ai_next)                         /* 显示获取的信息  */      {                                aip->ai_family == AF_INET6;          sinp6 = (struct sockaddr_in6 *)aip->ai_addr;                                  /* 为什么是for 循环 ,先向下看 */          int i;          printf("ipv6 addr = ");          for(i = 0; i < 16; i++)          {              if(((i-1)%2) && (i>0))              {                  printf(":");              }              printf("%02x",sinp6->sin6_addr.u.Byte[i]);              }          printf(" \n");          printf(" \n");       }      while(1);    }  int main(){         WORD wVersionRequested;      WSADATA wsaData;      int err;         wVersionRequested = MAKEWORD( 1, 1 );      err = WSAStartup( wVersionRequested, &wsaData );//initiate the ws2_32.dll and match the version      if ( err != 0 )      {          return 0;      }      if ( LOBYTE( wsaData.wVersion ) != 1 ||   //if the version is not matched ,then quit and terminate the ws3_32.dll          HIBYTE( wsaData.wVersion ) != 1 )      {          WSACleanup( );          return 0;      }      get_ip();      return 0;  }