【发布时间】:2019-01-08 20:25:27
【问题描述】:
我有两个 UDP 套接字绑定到同一个地址并连接到地址 A 和 B。我还有两个 UDP 套接字绑定到 A 和 B 但未连接。
这就是我的/proc/net/udp 的样子(为了便于阅读而进行了修剪):
sl local_address rem_address
3937: 0100007F:DD9C 0300007F:9910
3937: 0100007F:DD9C 0200007F:907D
16962: 0200007F:907D 00000000:0000
19157: 0300007F:9910 00000000:0000
根据connect(2):“如果socket sockfd的类型是SOCK_DGRAM,那么addr就是默认发送数据报的地址,是接收数据报的唯一地址。”
由于某种原因,我连接的套接字正在接收发往彼此的数据包。 eg:连接到A的UDP套接字向A发送消息,然后A返回回复。连接到 B 的 UDP 套接字向 B 发送消息,然后 B 发送回复。但是来自 A 的回复到达连接到 B 的套接字,而来自 B 的回复到达连接到 A 的套接字。
到底为什么会发生这种情况?请注意,它是随机发生的——有时回复到达正确的套接字,有时却没有。有什么方法可以防止这种情况或connect 应该不起作用的任何情况?
【问题讨论】:
-
这是一个重现此行为的 python 示例:gist.github.com/povilasb/53f1c802dbc2aca36a0ffa5b4cb95536