SO_REUSEPORT 多线程中的 UDP 服务器套接字

UDP server sockets in multiple threads with SO_REUSEPORT

对于我的 UDP 应用程序,我想将每个会话(4 元组)的处理分散到不同的线程。但是看起来如果有多个用于单播数据包的服务器套接字(绑定调用),内核只会将数据包传递给其中一个线程。

是否总是这种行为,或者是否有任何配置旋钮启用每个会话将传入数据包路由到不同的套接字?

指向将传入数据包传送到套接字的内核代码中的相关函数的指针也会有所帮助。

谢谢。

But looks like if there are multiple server sockets (bind calls) for unicast packets kernel will deliver the packet only to one of the threads.

这是正确的,数据包只会传送到一个套接字。

... enable per session routing of the incoming packets to different sockets ?

UDP 中没有会话,因此没有每个会话路由。

虽然可以连接 UDP 套接字,即同时调用 bind 和 connect。在这种情况下,数据包将被传送到连接的套接字。如果同一个源有多个连接的套接字,它将再次被传送到一个。请注意,已连接的套接字只会接收此连接的数据包,即不会像未连接的套接字那样来自任意来源。

Pointer to the relevant functions in the kernel code that delivers the incoming packet to the socket will also be helpful.

此行为并非特定于 Linux。