连接的UDP套接字出现意外行为

时间:2018-04-12 22:34:22

标签: linux sockets udp

根据error的联机帮助页

  

如果套接字sockfd的类型为SOCK_DGRAM,则addr是默认发送数据报的地址,也是接收数据报的唯一地址。

我的程序A在其套接字上调用connect(),地址为127.0.0.1,端口1212和程序B在其套接字上调用connect,地址为IN_ADDRANY,端口为1212。​​

当使用bind从程序A发送数据包时,程序B接收数据包并使用send指示源地址实际上是127.0.0.1。

当程序B在其地址为127.0.0.1的套接字上调用recvfrom并在connect之后调用端口1212时,会出现问题。当程序A发送数据包时,程序B将不再接收数据包。

这是预期的行为吗?

1 个答案:

答案 0 :(得分:2)

  

这是预期的行为吗?

我希望如此(哈哈) - 我认为问题在于程序B的connect()调用告诉B的UDP套接字它应该只接受来自127.0的传入UDP数据包。 0.1:1212 - 但程序A的数据包实际上来自127.0.0.1:xxxxx,其中xxxxx是网络堆栈隐式绑定程序A的UDP套接字的一些任意可用端口,因为程序A从不显式调用bind()(但是send()之前需要将A&#; UDP套接字绑定到端口,否则操作系统不知道如何填写源代码 - UDP包头中的端口字段)

如果是这种情况,那么您的选择是要么在调用bind()connect()之前将程序A显式send()其套接字连接到另一个众所周知的端口,或者让程序B在调用connect()之前以某种方式动态地找出A发送的端口,以便B可以将适当的端口号传递给connect()

或者我最喜欢的选项,即避免将connect()与UDP套接字结合使用,而只需使用sendto()recvfrom()。我发现这使我能够更好地控制UDP发送/接收行为,因此减少了麻烦。