LIBUV:Linux中的SO_REUSEPORT问题

时间:2015-08-28 14:16:36

标签: c linux sockets udp libuv

我在C中有一个基于libuv的UDP服务器,我们有一个:

  • 主线程:接收UDP数据包,并将其排入4个队列之一,并向4个工作程序之一调用dequeue回调。主线程是bind()到端口9930
  • 4个工作线程:在回调调用时从相应队列中出列,并发回响应。每个线程也绑定到相同的地址

现在,当我向UDP服务器发送请求(src_port:Adest_port:9930)时,服务器会使用src_port:Bdest_port:A的UDP数据包进行响应。我希望B等于9930.

我在线阅读了一些文章,并在UV_UDP_REUSEADDR中为主线程和4工作线程设置了uv_udp_bind()标志。但是,现在udp服务器并不总是接受请求,甚至不会调用接收回调。它确实有时并且对于这些情况,流程适用于端口B=9930

1 个答案:

答案 0 :(得分:1)

  

现在,当我向UDP服务器发送请求(src_port:A和dest_port:9930)时,服务器使用src_port:B和dest_port:A的UDP数据包进行响应。我希望B等于9930。

服务器必须从绑定到端口9930的套接字响应。例如。从收到请求的同一个套接字响应。

此外,工作线程可以共享主线程打开的同一个套接字。当多个线程在同一个UDP套接字上接收时,只有其中一个获取数据报。多个线程在同一个UDP套接字上发送也是安全的。