我有一个基于 libuv
的 C 语言 UDP 服务器,我们有一个:
- Main Thread:接收一个 UDP 数据包,将其排入 4 个队列之一,并调用对 4 个 worker 之一的出队回调。主线程是
bind()
到9930端口
- 4 个工作线程:在回调调用时从相应队列中出队并发回响应。每个线程也绑定(bind)到相同的地址
现在,当我向 UDP 服务器发送请求(src_port:A
和 dest_port:9930
)时,服务器以带有 src_port 的 UDP 数据包响应: B
和 dest_port:A
。我希望 B 等于 9930。
我浏览了一些在线文章并在 uv_udp_bind()
中为主线程和 4 工作线程设置了 UV_UDP_REUSEADDR
标志。但是,现在 udp 服务器并不总是接受请求,甚至没有调用接收回调。有时它确实如此,对于这些情况,端口 B=9930
的流程是正确的。
Now, when i send request (src_port:A and dest_port:9930) to the UDP server , the server responds with a UDP packet with src_port:B and dest_port:A. I want B to be equal to 9930.
然后服务器必须从绑定(bind)到端口 9930
的套接字进行响应。例如。从收到请求的同一个套接字做出响应。
此外,工作线程可以共享主线程打开的同一个套接字。当多个线程在同一个 UDP 套接字上接收时,只有其中一个获取数据报。多个线程在同一个 UDP 套接字上发送也是安全的。
我是一名优秀的程序员,十分优秀!