用C语言获取局域网上的所有主机?

用C语言获取局域网上的所有主机?,c,windows,network-programming,lan,C,Windows,Network Programming,Lan,是否有可能在局域网上获得所有主机(使用C)。我需要获取IP地址和主机名。如中所述,将对子网中的所有主机执行ping操作,并查看哪个主机响应或访问ARP缓存。第一种方法是通过使用 int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)); 但是,原始套接字基本上只提供IP报头,因此您需要自己构造ICMP回显数据包。构建之后,您只需使用sendto()将它们发送到子网中的每个IP,然后等待响应。对于第二种方法,我建议阅读以下内容 至于确定主机名,这取决

是否有可能在局域网上获得所有主机(使用C)。我需要获取IP地址和主机名。

如中所述,将对子网中的所有主机执行ping操作,并查看哪个主机响应或访问ARP缓存。第一种方法是通过使用

int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP));
但是,原始套接字基本上只提供IP报头,因此您需要自己构造ICMP回显数据包。构建之后,您只需使用
sendto()
将它们发送到子网中的每个IP,然后等待响应。对于第二种方法,我建议阅读以下内容

至于确定主机名,这取决于主机是否具有DNS或NETBIOS名称。如果您在LAN上配置了DNS,则可以在响应的地址上调用
getaddrinfo()
。不幸的是,我不知道如何找到任何给定IP的NETBIOS名称。

如中所述,将ping子网中的所有主机,并查看哪个主机响应或访问ARP缓存。第一种方法是通过使用

int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP));
但是,原始套接字基本上只提供IP报头,因此您需要自己构造ICMP回显数据包。构建之后,您只需使用
sendto()
将它们发送到子网中的每个IP,然后等待响应。对于第二种方法,我建议阅读以下内容


至于确定主机名,这取决于主机是否具有DNS或NETBIOS名称。如果您在LAN上配置了DNS,则可以在响应的地址上调用
getaddrinfo()
。不幸的是,我不知道如何找到任何给定IP的NETBIOS名称。

我不知道一种真正可移植的方法来做到这一点——这并不是说没有。如果您有一个内部DNS服务器,您可能能够查询该服务器并根据您的本地IP配置进行过滤(即,任何与10.*.*匹配的内容)。但即使这样,也无法捕获未在DNS中注册的计算机——有些可能不是,例如出于安全原因。显然,这是可能的。Win32有iPhelperAPI,它提供有关可用网络的信息,因此您可以选择看起来足够本地的网络,然后使用DnsQuery获取主机名。不需要使用ICMP-to-ping。我不知道一种真正可移植的方法来实现这一点——这并不是说没有。如果您有一个内部DNS服务器,您可能能够查询该服务器并根据您的本地IP配置进行过滤(即,任何与10.*.*匹配的内容)。但即使这样,也无法捕获未在DNS中注册的计算机——有些可能不是,例如出于安全原因。显然,这是可能的。Win32有iPhelperAPI,它提供有关可用网络的信息,因此您可以选择看起来足够本地的网络,然后使用DnsQuery获取主机名。不需要使用ICMP进行ping。