【发布时间】:2020-03-04 07:45:51
【问题描述】:
我有一个奇怪的问题,即 UDP 套接字上的连接行为取决于接收流量的接口。
我生成一个 UDP 套接字,它绑定到所有接口上的特定端口并等待传入的数据包。如果本地套接字上没有调用连接,我 (1) 连接到远程地址 (2) 跟踪套接字并 (3) 在同一本地端口上生成一个新的未连接套接字。如果在套接字上调用了 connect,我只需调用 recv 并处理数据。
当流量通过以太网接口时,流量会正确路由到连接的套接字。但是,在 wifi 接口上,流量总是会路由到新创建的、未连接的套接字。
我已经验证这在我的 ubuntu 机器上可以正常工作,这似乎是我正在开发的另一个硬件平台的怪癖。
我可以做些什么来调试问题? connect 系统调用永远不会失败但两个接口的行为不同的事实表明这不是内核问题。 IP 表中是否存在可能影响流量路由或 wifi 驱动程序的内容?还有什么?
【问题讨论】:
-
如果你必须拥有所有这些你不需要的套接字,最好创建一个新的套接字并连接它,同时保持原始套接字不连接。这样你就没有现在的时间窗口问题。在连接之前,如果您的系统上可用,您可以将新套接字绑定到传入数据报的目标地址,这应该可以解决这个问题。
-
@user207421 这是一个关于只连接新套接字的好点。我试过了,就行为而言并没有什么不同。与其说是比赛,不如说是内核或驱动程序没有正确路由流量。我尝试追踪到内核,但是所有的函数指针都使它变得困难。您是否熟悉任何可能影响此的防火墙规则?或者如果司机可能参与?我试过这个页面,但它很多:cs.unh.edu/cnrg/people/gherrin/linux-net.html#tth_chAp2
-
不要以为是防火墙。如果可以,请尝试绑定建议。
标签: linux sockets networking udp iptables