C++ 实现在 Windows 系统获取 ipv4 和 ipv6 地址

程序源码如下:

1. 形参ipv4, ipv6为外部调用者传入,用来保存ipv4地址和ipv6地址,

2. MAX_PATH为自定义宏, 为数值260, IPVN_SIZE为数值50, DEFAULT_STR_PORT为字符串"8080"

#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib,"Ws2_32.lib")


void CAllBox::getLocalIPv4( char * ip4)
{
	// 获得本机主机名
#ifdef _WIN32
	INT rc;
	WSADATA wsaData;

	rc = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (rc) {
		return ;
	}
#endif

	char hostname[MAX_PATH];
	memset(hostname, 0, MAX_PATH);
	gethostname(hostname, MAX_PATH);
	struct hostent FAR* lpHostEnt = gethostbyname(hostname);
	if (lpHostEnt == NULL)
	{
		return;
	}

	// 取得IP地址列表中的第一个为返回的IP, 即有线网卡IP(因为一台主机可能会绑定多个IP)
	LPSTR lpAddr = lpHostEnt->h_addr_list[0];

	// 将IP地址转化成字符串形式
	struct in_addr inAddr;
	memmove(&inAddr, lpAddr, 4);

#ifdef _WIN32
	WSACleanup();
#endif

	strncpy(ip4, inet_ntoa(inAddr), strlen(inet_ntoa(inAddr)));

	return;
}


void CAllBox::getLocalIPv6(char* ip6)
{
#ifdef _WIN32
	INT rc;
	WSADATA wsaData;

	rc = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (rc) {
		return ;
	}
#endif

	PHOSTENT hostinfo;
	char hostname[HOSTNAME_LEN];      //主机名  
	char *port = DEFAULT_STR_PORT;			//端口号
	int ilRc;

    memset(hostname, 0, HOSTNAME_LEN);

 	gethostname(hostname, sizeof(hostname));

	struct addrinfo hint;
	struct addrinfo *ailist = NULL, *aip = NULL;
	struct sockaddr_in6 *sinp6;

	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 = DEFAULT_PROT;               /*  设置协议  一般为0,默认 */
	hint.ai_addrlen = DEFAULT_ADDRLEN;                /*  下面不可以设置,为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[ERR_MSG_LEN];
		strcpy(str_error, (char *)gai_strerror(errno));
		return ;
	}
	if (ailist == NULL)
	{
		return ;
	}

	aip = ailist;
	aip->ai_family == AF_INET6;
	sinp6 = (struct sockaddr_in6 *)aip->ai_addr;     
	inet_ntop(AF_INET6, (void*)&sinp6->sin6_addr, ip6, IPVN_SIZE);

#ifdef _WIN32
	WSACleanup();
#endif

	return ;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值