当前位置:C++技术网 > 资讯 > 获取本机的机器名和IP地址

获取本机的机器名和IP地址

更新时间:2015-06-23 22:52:48浏览次数:1+次

    通过Winsock可以方便的查询到本机的主机名和IP地址列表。实现起来也不难,下面将所涉及到的细节和相关代码展示出来,并作出应有的解释,使读者再知道代码的同时还能够很清楚每句代码的含义,以后运用起来就灵活,理解也就很容易。
    因为使用的是WinSock网络接口,因此我们需要系统的相关的支持。需要一个库,名字为:Ws2_32.lib。使用前需要包含头文件才能够使用库中的函数。

#pragma comment(lib,"Ws2_32")
     这一句代码的作用是编译器的指令,达到的效果和在VS环境中设置导入库一样,使用这个命令,大家就不用去设置,避免编程工具不一致导致不知道如何去设置。这样,只要有这个代码就可以正确的使用了。
    括号中的lib表示后面的是一个lib文件的名字,告诉编译器,需要导入这个库文件。前面的是编译器的指令,经常见到,熟悉就可以了。如果需要了解编译指令更多知识,可以参考MSDN。
#include <Winsock2.h>
     这个是包含的WinSock的头文件,后面的2表示的是版本号,如果你使用的是更高版本,如Socket5,那么头文件是Winsock5,一般是这样,使用前最好参见MSDN的说明。
    所谓的WinSock,其实就是Window上的Socket应用,因此前面加了Win标示。

    相关的库和头文件准备好后,我们下一步就是使用了。
    首先,我们需要初始化这个套接字库,必须再使用前通过初始化告诉系统,你现在要使用套接字相关的东西了。如果不做这一步,下面的操作就不会成功。初始化的函数是:WSAStartup。

WSADATA wsaData;
WSAStartup(MAKEWORD(2,0),&wsaData);
     这个函数第一个参数是指定版本号,是一个WORD类型的参数,我们不好直接传入这个参数,所以我们就借助于宏MAKEWORD,在第一个宏参数传递一个主版本好,宏第二参数传递次版本号。初始化函数第二个参数为一个初始化结构体,用于记录初始化后的信息,只要给一个变量即可,根据参数的类型声明一个变量,传入地址即可。
    然后,就调用gethostname获取主机名。成功则返回0.成功后主机名返回到第一个参数中,以后可以自由处理。
char hostname[128]="";
if(gethostname(hostname,128)==0)
{
    CString HostName(hostname);
    GetDlgItem(IDC_HN)->SetWindowText(HostName);
}
    再次,通过调用gethostbyname,通过前面获得的主机名来获取IP列表。
((CListBox*)GetDlgItem(IDC_IPLIST))->ResetContent();//清空列表控件
hostent * phost = gethostbyname(hostname);//获得指向返回信息的结构体指针
for (int i=0;phost!=NULL&&phost->h_addr_list[i]!=NULL;i++)
{
    CString Addr(inet_ntoa(*(struct in_addr*)phost->h_addr_list[i]));
    //phost->h_addr_list[i]列表是IP地址数组,要先把数组元素的类型转换成Socket的IP地址类型
    //因此就是先转换成struct in_addr*,然后提取出IP地址。
    //通过inet_ntoa将其转换成字符串。
    ((CListBox*)GetDlgItem(IDC_IPLIST))->AddString(Addr);//添加到列表中
}
     最后,使用完后,清除环境,退出查询。
WSACleanup();
     提示:WSA在初次接触并不知道它代码什么含义,看着这样的名字就很别扭,我来告诉你。WSA是Windows Socket API的缩写,表示Windows平台下的套接字API,后面的是函数名,这样的话,就很容易接受这个陌生的名字了。
    赶紧试试吧。看看你的程序能不能查询出来,有问题,留言哦。