【发布时间】:2016-04-17 02:00:16
【问题描述】:
在使用 TCP 套接字的网络编程(C 和 Linux)中,我如何检查接收数据包的接口。我知道这可以通过 SOCK_DGRAM 和 IP 选项 IP_PKTINFO 轻松完成,但此选项不适用于 SOCK_STREAM。在这种情况下(对于我的编程)我必须知道接收数据包的接口(返回服务器的响应取决于此)。
我发现的一个可能的解决方案是使用 SOCK_RAW 和 IPPROTO_TCP(使用 SOCK_RAW 我可以设置 IP_PKTINFO 选项)但这意味着我将接收到达机器的所有 TCP 流量,我不希望那样.我正在考虑的另一个可能的解决方案是根据路由表检查目标 IP 并从那里获取退出接口,但是 IPv6 呢?如果命运 IP 是 IPv6 本地链路怎么办?
如果有人有其他解决方案或想法,我会很高兴阅读。提前致谢
【问题讨论】:
-
在 TCP 中,您将在接受时收集该信息,而不是每个数据包。它由接受的套接字上的
getsockname()给出。但是弱端系统模型意味着它不可靠。 -
你说得对,非常感谢
标签: c linux network-programming