【问题标题】:LIBUV : SO_REUSEPORT issue in LinuxLIBUV:Linux 中的 SO_REUSEPORT 问题
【发布时间】:2015-08-28 14:16:35
【问题描述】:

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

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

现在,当我向 UDP 服务器发送请求(src_port:Adest_port:9930)时,服务器以带有 src_port:Bdest_port:A 的 UDP 数据包响应。我希望 B 等于 9930。

我在网上浏览了一些文章,并在uv_udp_bind() 中为主线程和4 个工作线程设置了UV_UDP_REUSEADDR 标志。但是,现在 udp 服务器并不总是接受请求,甚至没有调用接收回调。有时确实如此,对于这些情况,端口B=9930 的流量是正确的。

【问题讨论】:

    标签: c linux sockets udp libuv


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,这就是我想要发生的事情,但它没有
    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2015-05-13
    相关资源
    最近更新 更多