vc获取本地IP

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

posted @ 2013-02-08 22:23  N3verL4nd  阅读(235)  评论(0编辑  收藏  举报