最佳 UDP 通信应该如何工作? (临时端口)
How optimal UDP communication should work? (ephemeral port)
你好,我刚刚遇到基于 UDP 的双向通信问题。当前的解决方案是这样工作的:
A 面:
- 监听端口 X 的独立套接字 a1
- 独立套接字a2用于向B端和X端口请求
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()
中。
你好,我刚刚遇到基于 UDP 的双向通信问题。当前的解决方案是这样工作的:
A 面:
- 监听端口 X 的独立套接字 a1
- 独立套接字a2用于向B端和X端口请求
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()
中。