c - 获取主机的protobyname

标签 c linux network-programming

我的项目遇到了一个小死胡同。我需要检索网络内任何给定设备(具有 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/

相关文章:

c++ - 有没有一种将变量名转换为双指针的简便方法?

ruby - GTK - 不要在选择/悬停时突出显示按钮

sockets - 如何格式化 HTTP 响应

c - 使用 regex.h 进行字符之间的匹配

c - 类似函数的宏和变量

linux - 如何在 Linux 中创建人工麦克风输入?

linux - proftpd 使用用户定义的消息限制写入目录

java - 使用 Java 重写二进制流

linux - 获取正在路由的数据包

C程序数组打印不正确的数据