gpt4 book ai didi

linux - socket编程中如何获取receiver的接收接口(interface)信息?

转载 作者:太空宇宙 更新时间:2023-11-04 04:33:50 25 4
gpt4 key购买 nike

在通常的套接字编程中,比如说,简单的UDP套接字,是否也可以在接收数据的应用程序中获取接收接口(interface)信息?怎么办?

例如,我从接口(interface) eth1 接收到一个 pkt,那么有什么方法可以在数据包数据的同时获得 pkt 从 eth1 设备传入的信息?

最佳答案

简而言之,不使用套接字。原因,一言以蔽之,就是“路由”。

当你的机器有多个接口(interface)时,内核会在它们之间路由 UDP 和 TCP 数据包。即使关闭转发,本地目标(IP 地址)也不会非常牢固地固定在网络接口(interface)上。

当同一网络上有两个具有不同 IP 的接口(interface)时,您会看到这一点。当您对属于其中一个接口(interface)的 IP 地址发出 ARP 请求时,您实际上会收到两个 MAC 的 ARP 响应(这是从内存中获得的)。

我想说的是,内核确实不关心特定 UDP 数据包通过哪个接口(interface)到达。

虽然您无法获取消息到达的接口(interface)名称(至少,不需要 root 访问权限,例如设置 iptables 过滤器或使用原始套接字),但我确信您可以获取此数据包发送到的 IP 地址。然而,查看文档,我找不到这样的选项。您可以使用 recvmsgmsg_name 字段获取发件人的 IP 地址(源地址),但不能获取目标地址。

我给您的建议是,如果此信息对您很重要,请为每个接口(interface)打开一个套接字,并将该套接字绑定(bind)到该接口(interface)。您可以通过 bind 命令使用基于 IP 的绑定(bind),也可以使用 IOCTL 强制套接字仅通过该接口(interface)发送数据包(但我很难理解您为什么要这样做)。

关于linux - socket编程中如何获取receiver的接收接口(interface)信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37354491/

25 4 0
文章推荐: responsive-design - 图像不响应浏览器大小
文章推荐: html - CSS div block 导致 WebKit 浏览器上的列表错位
文章推荐: python - 为什么 Pandas read_excel 函数在 Pyinstaller .exe 中返回错误,但在 Python 解释器下却没有?
文章推荐: html - CSS: space
  • 所以它们在固定高度的
  • Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com