C/ VC++语言 获取本机IP地址

6 篇文章 0 订阅
3 篇文章 0 订阅
获取本机所有IP地址
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>

#pragma comment (lib, "Ws2_32.lib")

void get_host_ip()
{
	WSADATA WSAData;
	if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0)
	{
		printf("WSAStartup() error!\n");
		return;
	}
	int ret;
	struct addrinfo hints;
	struct addrinfo *res, *cur;
	struct sockaddr_in *addr;
	char m_ipaddr[16];

	memset(&hints, 0, sizeof(struct addrinfo));
	hints.ai_family = AF_INET;     /* Allow IPv4 */
	hints.ai_flags = AI_PASSIVE;/* For wildcard IP address */
	hints.ai_protocol = 0;         /* Any protocol */
	hints.ai_socktype = SOCK_DGRAM;

	ret = getaddrinfo("", NULL, &hints, &res);

	if (ret == -1) {
		perror("getaddrinfo");
		exit(1);
	}
	for (cur = res; cur != NULL; cur = cur->ai_next) {
		addr = (struct sockaddr_in *)cur->ai_addr;
		sprintf_s(m_ipaddr, 16, "%d.%d.%d.%d",
			(*addr).sin_addr.S_un.S_un_b.s_b1,
			(*addr).sin_addr.S_un.S_un_b.s_b2,
			(*addr).sin_addr.S_un.S_un_b.s_b3,
			(*addr).sin_addr.S_un.S_un_b.s_b4);
		printf("%s\n", m_ipaddr);
	}
	freeaddrinfo(res);
	WSACleanup();
}

int  main(int argc, char **argv)
{
	get_host_ip();
	system("pause");
	return 0;
}

参阅百度百科 “getaddrinfo()”

VC++获取本机地址

//m_sock为CSocket类对象
void CChatApp::InitInfo()
{
	if (!m_sock.Create(UPORT, SOCK_DGRAM))
	{
		AfxMessageBox(_T("端口创建失败!"));
		return;
	}
	//获取设备名称
	SInfo& info = m_info;
	gethostname(info.sHost, sizeof(info.sHost));
	//获取本机IP地址
	ADDRINFOA hints;
	ADDRINFOA* result;
	ZeroMemory(&hints, sizeof(ADDRINFO));
	hints.ai_family = AF_INET;
	hints.ai_protocol = 0;
	hints.ai_flags = AI_PASSIVE;
	hints.ai_socktype = SOCK_DGRAM;
	int res = GetAddrInfo(info.sHost, NULL, &hints, &result);
	SOCKADDR_IN* addr = (SOCKADDR_IN*)result->ai_addr;
	IN_ADDR* ad = (IN_ADDR*)&addr->sin_addr;
	inet_ntop(result->ai_family, ad, info.sIP, sizeof(info.sIP));
	//获取用户名
	DWORD dw = sizeof(info.sName);
	GetUserName(info.sName, &dw);

	//以255结尾的IP地址是虚拟IP,用于网段内群发数据
	CString sIP(info.sIP);
	int i = sIP.ReverseFind('.');
	sIP = sIP.Left(i + 1) + _T("255");
	SPack pack = { SEND_HELLO };
	memcpy(pack.data, &info, sizeof(info));
	m_sock.SendTo(&pack, sizeof(info) + sizeof(int), UPORT, sIP);
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值