获取本机所有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);
}