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