获取主机信息(C++和C#版)
2007-01-11 16:46
483 查看
在C语言中,主机信息是存储在一个hostent结构体中,它的结构如下:
struct hostent
{
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
};
解释一下这个结构:
char *h_name; 表示的是主机的规范名。例如 http://www.google.com/ 的规范名其实是 http://www.l.google.com/ 。
char **h_aliases; 表示的是主机的别名。 http://www.google.com/ 就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。
int h_addrtype; 表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是ipv6(AF_INET6)
int h_length; 表示的是主机ip地址的长度
char **h_addr_list; 表示的是主机的ip地址,注意,这个是以网络字节序存储的。不能直接用printf带%s参数来打这个东西,需要调用inet_ntop()函数转换。
下面是一个获取主机信息的例子。
#include
<ace/OS.h>
int main(int argc, char *argv[])
{
//获取本机主机名
char hostname[20];
ACE_OS::hostname(hostname,20);
struct hostent *hptr;
//调用gethostbyname()获取主机地址信息
if( (hptr = ACE_OS::gethostbyname(hostname) ) == NULL )
{
printf("gethostbyname error for host:%s\n", hostname);
return 0; //如果调用gethostbyname发生错误,返回
}
//将主机的规范名打出来
printf("hostname:%s\n",hptr->h_name);
char **pptr;
//主机可能有多个别名,将所有别名分别打出来
for(pptr = hptr->h_aliases; *pptr != NULL; pptr++)
printf(" alias:%s\n",*pptr);
char ip[32];
//根据地址类型,将地址打出来
switch(hptr->h_addrtype)
{
case AF_INET:
case AF_INET6:
pptr=hptr->h_addr_list;
//将刚才得到的所有地址都打出来。其中调用了inet_ntop()函数
for(;*pptr!=NULL;pptr++)
printf("address:%s\n", ACE_OS::inet_ntop(hptr->h_addrtype, *pptr, ip, sizeof(ip)));
break;
default:
printf("unknown address type\n");
break;
}
return 0;
}
C#和C++一样,主机信息存储在IPHostEntry类中,不过它封装得较好,下列C#代码实现了同样的功能,比C++的要精简得多。
static
void Main(string[] args)
{
string hostName = Dns.GetHostName(); //获取本地主机名
IPHostEntry hostInfo = Dns.GetHostEntry(hostName); //获取主机消息
//打印主机名
Console.WriteLine("host name:\t{0}",hostInfo.HostName);
//打印主机关联的别名
foreach (string name in hostInfo.Aliases)
{
Console.WriteLine("aliases:\t{0}",name);
}
//打印ip地址消息
foreach (IPAddress ip in hostInfo.AddressList)
{
Console.WriteLine("ip:\t{0}",ip);
}
}
struct hostent
{
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
};
解释一下这个结构:
char *h_name; 表示的是主机的规范名。例如 http://www.google.com/ 的规范名其实是 http://www.l.google.com/ 。
char **h_aliases; 表示的是主机的别名。 http://www.google.com/ 就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。
int h_addrtype; 表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是ipv6(AF_INET6)
int h_length; 表示的是主机ip地址的长度
char **h_addr_list; 表示的是主机的ip地址,注意,这个是以网络字节序存储的。不能直接用printf带%s参数来打这个东西,需要调用inet_ntop()函数转换。
下面是一个获取主机信息的例子。
#include
<ace/OS.h>
int main(int argc, char *argv[])
{
//获取本机主机名
char hostname[20];
ACE_OS::hostname(hostname,20);
struct hostent *hptr;
//调用gethostbyname()获取主机地址信息
if( (hptr = ACE_OS::gethostbyname(hostname) ) == NULL )
{
printf("gethostbyname error for host:%s\n", hostname);
return 0; //如果调用gethostbyname发生错误,返回
}
//将主机的规范名打出来
printf("hostname:%s\n",hptr->h_name);
char **pptr;
//主机可能有多个别名,将所有别名分别打出来
for(pptr = hptr->h_aliases; *pptr != NULL; pptr++)
printf(" alias:%s\n",*pptr);
char ip[32];
//根据地址类型,将地址打出来
switch(hptr->h_addrtype)
{
case AF_INET:
case AF_INET6:
pptr=hptr->h_addr_list;
//将刚才得到的所有地址都打出来。其中调用了inet_ntop()函数
for(;*pptr!=NULL;pptr++)
printf("address:%s\n", ACE_OS::inet_ntop(hptr->h_addrtype, *pptr, ip, sizeof(ip)));
break;
default:
printf("unknown address type\n");
break;
}
return 0;
}
C#和C++一样,主机信息存储在IPHostEntry类中,不过它封装得较好,下列C#代码实现了同样的功能,比C++的要精简得多。
static
void Main(string[] args)
{
string hostName = Dns.GetHostName(); //获取本地主机名
IPHostEntry hostInfo = Dns.GetHostEntry(hostName); //获取主机消息
//打印主机名
Console.WriteLine("host name:\t{0}",hostInfo.HostName);
//打印主机关联的别名
foreach (string name in hostInfo.Aliases)
{
Console.WriteLine("aliases:\t{0}",name);
}
//打印ip地址消息
foreach (IPAddress ip in hostInfo.AddressList)
{
Console.WriteLine("ip:\t{0}",ip);
}
}
相关文章推荐
- C#获取当前主机硬件信息
- C#调用C++DLL 使用 德卡 读卡器 获取身份证信息
- C#获取当前主机硬件信息
- C#获取当前主机硬件信息
- 【转】C#获取客户端及服务器端主机信息及其获取IP地址
- C++获取主机信息
- C#获取当前主机硬件信息
- C#: WMI 获取远程 Windows 主机信息
- 初学者必看 C++简单的主机间的通信并获取服务器端的Sysinfo信息
- C#获取当前主机硬件信息
- C#获取当前主机硬件信息
- C#获取当前主机硬件信息
- C#获取客户端及服务器端主机信息
- C#获取当前主机硬件信息
- C++获取计算机主机信息(计算机名称、IP)
- C++获取计算机主机信息(计算机名称、IP)
- windows主机网络信息获取程序设计
- 5 个获取 Linux 主机信息的命令
- 获取主机的信息
- 使用Java代码获取服务器性能信息及局域网内主机名