【问题标题】:Check incoming interface on TCP socket检查 TCP 套接字上的传入接口
【发布时间】: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


【解决方案1】:

当你的 TCP 服务器接受客户端连接时,你会有一个 socket 来代表这个连接,你可以在 socket 上调用getsockname,它会给你在 socket 上关联的地址,即你这边的 ip 地址. 下一步,您可以致电getifaddrs 获取系统上的所有接口及其信息,包括名称(如 eth0)和 IP 地址。此时你可以用之前通过getsockname获取的ip搜索这个列表,就可以得到你想要的界面了。

参考:

http://linux.die.net/man/2/getsockname

http://linux.die.net/man/3/getifaddrs

【讨论】:

  • 是的!这是完全正确的,我知道getsockname() funcionality,但我以前没有考虑过。无论如何,感谢您,感谢修复原始帖子语法错误的人:)
猜你喜欢
  • 2014-04-08
  • 1970-01-01
  • 2013-05-25
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
相关资源
最近更新 更多