#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转换成一个互联网标准点分格式的字符串。