获取计算机的名称和IP地址可以通过调用winsock里面的函数完成,下面上是用到的函数:1.WSAStartup(),此函数在应用程序中初始化windows sockets DLL,这个函数调用成功后,才可以调用其他的api函数。
2.WSACleanup()函数,应用程序会占用系统资源,这个函数用来解除与socket的绑定,并且释放占用的系统资源。
3.gethostname() 用于获取本地主机的主机名
4.gethostbyname(),gethostname()获取的主机名可以传入gethostbyname,获取“主机列表”。一台主机可以有多个IP地址,为了输出所有IP地址,要用一个循环来实现。
#include <iostream>
using namespace std;
#include "winsock2.h"
#pragma comment(lib,"ws2_32.lib")
int main()
{
WSAData data;
if(WSAStartup(MAKEWORD(1,1),&data)!=0)
{
cout<<"初始化错误endl ;
}
char host[255];
if(gethostname(host,sizeof(host))==SOCKET_ERROR)
{
cout<<"无法获取主机名"<<endl;
}
else
{
cout<<"本机计算机名为:"<<host<<endl;
}
struct hostent *p=gethostbyname(host);
if(p==0)
{
cout<<"无法获取计算机主机名及IP"<<endl;
}
else
{
//本机IP:利用循环,输出本机所有IP
for(int i=0;p->h_addr_list[i]!=0;i++)
{
struct in_addr in;
memcpy(&in,p->h_addr_list[i],sizeof(struct in_addr));
cout<<"第"<<i+1<<"块网卡的IP为:"<<inet_ntoa(in)<<endl;
}
}
WSACleanup();
cin.get();
return 0;
}
上面的代码中,gethostbyname的返回值送入了hostent结构体中,hostent结构体在winsock2.h中声明
hostent的定义如下:
struct hostent{
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
# define h_addr h_addr_list[0];
};
h_name 为地址名称
h_aliases 地址的预备名称指针
h_addtype 地址类型
h_length 地址的长度
h_addr_list 主机网络地址指针
h_addr h_add_list 的第一个地址