C++在windows下獲取本地主機ipv4地址和ipv6地址

mx3y 9年前發布 | 2K 次閱讀 C/C++

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>

 本文由用戶 mx3y 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!