最佳 UDP 通信应该如何工作? (临时端口)

How optimal UDP communication should work? (ephemeral port)

你好,我刚刚遇到基于 UDP 的双向通信问题。当前的解决方案是这样工作的:

A 面:

B 面:

到目前为止它是这样工作的:发送请求只需通过 socket.a2:X 发送数据包,然后从独立的 socket.a1:X 接收数据包(端口相同)。

B 面更新后停止工作

我知道对于 TCP 它的一侧侦听器,当它接受连接时,它会在随机临时端口上打开另一个套接字并在那里保持通信(详细信息由 os 管理)。

UDP有没有类似的机制?使用一个套接字进行发送和收听是更好的方法吗?我在 tcpdump UDP 数据包中看到,现在目标是随机端口而不是端口 X。

我尝试使用一个套接字但无法正常工作(甚至尝试连接并侦听本地端点 - 不工作)。

感谢您的澄清。

(肯定没有防火墙或路由问题)

UDP中没有“监听”的概念,只是绑定一个端口然后发送and/or接收包。因此,在 UDP 套接字上调用 listen()accept() 是错误的,并且不会完成任何有用的事情。

在 UDP 中(几乎没有)“连接”的概念,但是 connect() 在 UDP 套接字上除了设置默认目标地址(和数据包源过滤器)之外没有做任何事情) 对于 send()recv() 调用(分别)当它们与该套接字一起使用时,这样您就可以将这些函数与 UDP 套接字一起使用,而不是总是调用 sendto()recvfrom().但在实践中,我建议不要将 connect() 与 UDP 套接字一起使用,因为能够为 send()recv() 提供一个更少参数的优势被以下事实所抵消已调用 connect() 的 UDP 套接字将只能接收来自单个源 IP 地址和端口的传入数据包。

很可能(并且可以说更可取)使用单个 UDP 套接字来发送和接收;只是 bind() 它到一个端口,然后调用 sendto() and/or recvfrom() 就可以了。如果需要,您甚至可以使用单个 UDP 套接字发送到多个目的地并从多个源接收。请注意,您可能会发现将 UDP 套接字设置为非阻塞并使用 select()poll() 或类似于 wait-for-I/O-ready 函数很有用,因为使用默认(阻塞)I/O 风格,当你想要 sendto() 一个数据包时,很容易导致你的 I/O 线程长时间卡在 recvfrom() 中。