#include<stdio.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
void getLocalIp(void)
{
WSADATA wsaData;
char name[155];
if ( WSAStartup( MAKEWORD(2,0), &wsaData ) == 0 )
{
if(gethostname(name,sizeof(name)) == 0)
{
printf("%s\n",name);
struct hostent* phe = gethostbyname(name);
if (0 == phe)
{
return;
}
for (int i = 0; phe->h_addr_list[i] != 0; ++i)
{
struct in_addr addr;
memcpy(&addr, phe->h_addr_list[i], sizeof(struct in_addr));
printf("IP %d:%s\n",i+1,inet_ntoa(addr));
}
}
WSACleanup( );
}
}
int main(void)
{
getLocalIp();
return 0;
}
WSADATA wsdData; //这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets数据。它包含Winsock.dll执行的数据。
struct hostent *hn;hostent是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表。之所以主机的地址是一个列表的形式,原因是当一个主机有多个网络接口时,自然有多个地址。
char HostName[255] = {0};
WSAStartup(MAKEWORD(2,0),&wsdData);WSAStarup,是Windows SocKNDs Asynchronous的启动命令、Windows下的网络编程接口软件 Winsock1 或 Winsock2 里面的一个命令。
gethostname(HostName, sizeof(HostName));//int PASCAL FAR gethostname(char FAR *name, int namelen);
printf("%s\n",HostName);
hn = gethostbyname(HostName);//gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。结构的声明与gethostaddr()中一致。
printf("%s\n",inet_ntoa(*(struct in_addr *)hn->h_addr_list[0]));//将一个IP转换成一个互联网标准点分格式的字符串。