C 如何找到默认网关的地址和面向它的本地地址?
我正在实现一个在Linux中工作的端口控制协议(PCP)客户端,用C实现。它需要连接到默认网关才能打开端口。PCP需要在消息本身中嵌入本地IP地址,而不仅仅是在IP报头中(可能这是为了检测路径中是否存在不需要的NAT,但对于我来说,机器本身与其默认网关之间如何存在NAT是个谜)。PCP还需要连接到默认网关,需要其地址 这提出了两个问题: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中
有关问题的答案如下:
/proc/net/route
中轻松找到。这是一条掩码为零,目的地为零的路线。所有十六进制值都是按网络字节顺序排列的,因此,如果IP地址需要精确打印或与主机字节顺序的地址进行比较,则可能需要ntohl
bind()
it、connect()
it到默认网关,并使用getsockname()
查找自动绑定到的IP地址/proc/net/route
要容易得多。第二种选择是在其输出上使用管道fork
和exec
netstat
,并解析其输出,但这将使程序依赖于外部二进制文件
(2)的另一种方法是使用NETLINK套接字查找本地IP地址,然后尝试推断将使用哪个地址连接到默认网关,但让Linux内核自动进行推断并使用getsockname()
读取结果要容易得多。第二种选择是在其输出上使用管道的fork
和exec
ip
或ifconfig
,并解析其输出并确定将使用哪个ip地址(/proc/net/route
的第一个字段给出了默认路由的接口,因此接口名称已经已知),但这也将使程序依赖于外部二进制文件,并且可能不会始终安装ifconfig
,而且这将需要在用户空间中执行演绎过程。可能重复、、等。@jww问题中只有一半是重复的。。。PCP要求找到默认网关的IP地址,而这一部分在现有问题中根本没有解释。