我的项目遇到了一个小死胡同。我需要检索网络内任何给定设备(具有 Linux 内核)支持的协议(protocol)。我知道 getprotobyname 方法可以完成这项工作,但根据我目前的知识,我只能成功地实现它来获取运行代码的本地计算机的协议(protocol)详细信息。代码如下,
#include <stdio.h>
#include <netdb.h>
int main (int argc, char *argv[]) {
int i;
struct protoent *proto = getprotobyname("ipv6");
if ( proto != NULL )
{
printf("Official name: %s\n", proto->p_name);
printf("Port#: %d\n", proto->p_proto);
for ( i = 0; proto->p_aliases[i] != 0; i++ )
.
printf("Alias[%d]: %s\n", i+1,
proto->p_aliases[i]);
}
else
perror("protocol not found");
}
我的问题是如何实现这个解决方案,我可以解析目标设备的 IP 地址,以便 getprotobyname
可以尝试识别目标设备协议(protocol)。非常感谢任何示例代码段或引用。解决这个问题将减轻我肩上的负担,再次感谢:)
编辑
执行我的要求的任何替代方法也会非常有帮助:)
最佳答案
简而言之:你不能。
getprotocolbyname()
只是从本地 (/etc/protocols) 文本文件中检索静态信息(协议(protocol)名称、ip header 协议(protocol)标识号等),旨在将数字映射到人类可读的协议(protocol)信息。
该文件中出现的任何协议(protocol)并不意味着本地计算机完全支持该协议(protocol)。这与例如非常相似/etc/services 将端口号与服务名称相匹配。如果文件中出现服务,这并不意味着机器提供该服务。
关于c - 获取主机的protobyname,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22717781/