在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);
}
}
分享到:
相关推荐
标题中的“uvc.rar”是一个压缩包文件,包含与USB UVC(通用视频类)相关的C++和C#编程资源,以及UVC相机驱动程序。UVC是USB设备类定义的一部分,它允许USB设备(如摄像头)以标准化的方式在Windows、Linux和Mac OS...
本示例项目"**C++ Scoket实现Client获取本机计算机名和ip地址发送到Server**"旨在教授如何利用C++进行Socket编程,以便客户端(Client)能够获取本地计算机的名称和IP地址,并将这些信息发送给服务器(Server)。...
"ARP扫描局域网主机ip和MAC(c#)归类" 本文档主要介绍了使用C#语言实现ARP扫描局域网主机IP和MAC地址的方法。...9. 学习C#和C++的关系:通过学习C#,可以更好地理解C++的运行方式,因为两者模式相似。
总之,`GetAdaptersInfo`是Windows API中获取网络适配器信息的重要工具,通过适当处理返回的数据,我们可以精确地获取到本地主机的物理网卡信息,排除无线和虚拟网络设备,以满足特定的应用需求。
在C++和C#这两种编程语言中,我们可以利用UDP协议进行网络通信。下面将详细介绍如何在C++和C#中实现UDP通信,并讨论其相关知识点。 一、C++中的UDP通信 1. **套接字库(Socket Library)**:C++中,进行网络通信...
内含SDK、开发文档 及Demo示例(C++、C#、Java) 设备网络SDK是基于设备私有网络通信协议开发的,为后端设备(嵌入式网络硬盘录像机、视频服务器)、前端设备(网络摄像机、网络球机、IP模块)等产品服务的配套模块...
在编程中,如C++或C#,可以使用Windows API或.NET Framework提供的网络相关类库来实现这一功能。 总的来说,获取本机网卡信息是网络运维的基础工作,涉及硬件识别、网络配置、多网卡管理等多个层面,对于理解网络...
该文档是关于使用C#语言实现ARP扫描局域网中主机IP和MAC地址的一个项目报告。ARP(Address Resolution Protocol)是一种网络协议,用于通过IP地址查找对应的物理MAC地址。以下是该项目涉及的关键知识点: 1. **...
C API提供`mysql_error()`函数获取最后一次操作的错误信息,而C++ Connector/C++通常会抛出异常,可以使用try-catch结构来捕获并处理。 6. **关闭连接**:在完成数据库操作后,我们需要释放资源,断开与MySQL服务器...
总结来说,"UVC图像获取及Extension unit数据获取"是一项高级的硬件集成技术,它涵盖了USB视频类设备的高效图像处理和定制化功能的利用。通过掌握这些知识,开发者能够构建出更强大的视频处理系统,适用于各种应用...
在Windows环境下,可以使用`CreateToolhelp32Snapshot`和`Process32First/Next`API来遍历进程,结合`CreateFile`和`DeviceIoControl`等函数获取每个进程的TCP连接信息。 总之,获取打开端口号的进程ID是系统管理和...
可以使用`Dns.GetHostEntry()`获取主机名对应的IP地址。 6. **接收和发送数据**:使用`UdpClient`的`ReceiveAsync()`方法异步接收数据,该方法会返回一个`UdpReceiveResult`结构,包含接收到的数据和发送方的IP和...
例如,IPAddress.TryParse用于验证输入的IP地址格式,而IPHostEntry类的AddressList属性可以获取主机的多个IP地址。 4. **端口范围判断**:根据IANA(互联网编号分配机构)的规定,端口0-1023为系统保留端口,1024-...
`Uri`类可以解析和操作URL,包括提取主机名、端口和路径等信息。 4. **URL编码与解码**:URL中可能包含特殊字符,需要进行编码以符合URL规范。`HttpUtility`类提供了`UrlEncode`和`UrlDecode`方法,用于对URL进行...
虚拟机允许我们在一个物理主机上运行多个独立的操作系统实例,提高了资源利用率和灵活性。然而,有时候我们可能需要确定我们的程序是否在虚拟环境中运行,比如出于安全考虑或者性能优化的目的。本文将详细介绍如何...
通过`chrome.tabs.query`方法,传入一个包含`active: true`的对象作为参数,可以获取到当前活动标签页的信息,其中就包含了URL。 在桌面应用程序中,如果需要与Web浏览器交互,可以使用各种API或库。例如,对于...
实例50 获取网络主机IP地址 实例51 C#对话信息框的应用 实例52 在C#中快速调用Windows API 实例53 摄氏温度与华氏温度间相互转换(1) 实例54 摄氏温度与华氏温度间相互转换(2) 实例55 使用FileSystemWatcher...
测试完成后,你可以通过`ChrWorkload`对象的`Results`属性获取测试结果,包括吞吐量、延迟等信息。 ```csharp ChrTestResult result = workload.Results[0]; Console.WriteLine("Throughput: " + result....