C 如何找到默认网关的地址和面向它的本地地址?

C 如何找到默认网关的地址和面向它的本地地址?,c,linux,routing,network-programming,ip-address,C,Linux,Routing,Network Programming,Ip Address,我正在实现一个在Linux中工作的端口控制协议(PCP)客户端,用C实现。它需要连接到默认网关才能打开端口。PCP需要在消息本身中嵌入本地IP地址,而不仅仅是在IP报头中(可能这是为了检测路径中是否存在不需要的NAT,但对于我来说,机器本身与其默认网关之间如何存在NAT是个谜)。PCP还需要连接到默认网关,需要其地址 这提出了两个问题: 如何查找默认网关的IP地址 即使存在多个接口和IP地址,如何找到通向默认网关的机器IP地址 有关问题的答案如下: 默认网关可以在/proc/net/route中

我正在实现一个在Linux中工作的端口控制协议(PCP)客户端,用C实现。它需要连接到默认网关才能打开端口。PCP需要在消息本身中嵌入本地IP地址,而不仅仅是在IP报头中(可能这是为了检测路径中是否存在不需要的NAT,但对于我来说,机器本身与其默认网关之间如何存在NAT是个谜)。PCP还需要连接到默认网关,需要其地址

这提出了两个问题:

  • 如何查找默认网关的IP地址
  • 即使存在多个接口和IP地址,如何找到通向默认网关的机器IP地址

  • 有关问题的答案如下:

  • 默认网关可以在
    /proc/net/route
    中轻松找到。这是一条掩码为零,目的地为零的路线。所有十六进制值都是按网络字节顺序排列的,因此,如果IP地址需要精确打印或与主机字节顺序的地址进行比较,则可能需要
    ntohl
  • 查找默认网关的IP地址的最简单方法是创建一个UDP套接字,而不是创建一个
    bind()
    it、
    connect()
    it到默认网关,并使用
    getsockname()
    查找自动绑定到的IP地址
  • 有了这些功能,我的PCP客户端完全不需要手动配置IP地址。它会自动检测默认网关和指向默认网关的IP地址

    对于(1),另一种选择可能是NETLINK套接字,但解析
    /proc/net/route
    要容易得多。第二种选择是在其输出上使用
    管道
    fork
    exec
    netstat
    ,并解析其输出,但这将使程序依赖于外部二进制文件


    (2)的另一种方法是使用NETLINK套接字查找本地IP地址,然后尝试推断将使用哪个地址连接到默认网关,但让Linux内核自动进行推断并使用
    getsockname()
    读取结果要容易得多。第二种选择是在其输出上使用
    管道
    fork
    exec
    ip
    ifconfig
    ,并解析其输出并确定将使用哪个ip地址(
    /proc/net/route
    的第一个字段给出了默认路由的接口,因此接口名称已经已知),但这也将使程序依赖于外部二进制文件,并且可能不会始终安装
    ifconfig
    ,而且这将需要在用户空间中执行演绎过程。

    可能重复、、等。@jww问题中只有一半是重复的。。。PCP要求找到默认网关的IP地址,而这一部分在现有问题中根本没有解释。