根据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将不再接收数据包。
这是预期的行为吗?
答案 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发送/接收行为,因此减少了麻烦。