获取本地主机ipv4地址和ipv6地址
文章转自王牌软件
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
只回答业务咨询
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
#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; } |
学习日记,兼职软件设计,软件修改,毕业设计。
本文出自 学习日记,转载时请注明出处及相应链接。
本文永久链接: https://www.softwareace.cn/?p=331