Linux上的SO_REUSEPORT

时间:2010-07-16 04:36:43

标签: linux sockets udp

我想知道LINUX 2.6中是否启用了SO_REUSEPORT选项??

如果我尝试使用它并编译我的代码,我会收到以下错误

01.c:72: error: `SO_REUSEPORT' undeclared (first use in this function)
01.c:72: error: (Each undeclared identifier is reported only once
01.c:72: error: for each function it appears in.)

使用上面的选项我想我可以将两个不同的套接字绑定到相同的IPADRESS和PORT NUMBER

5 个答案:

答案 0 :(得分:8)

答案 1 :(得分:5)

来自/usr/include/asm-generic/socket.h

/* For setsockopt(2) */
#define SOL_SOCKET      1

#define SO_DEBUG        1
#define SO_REUSEADDR    2
#define SO_TYPE         3
#define SO_ERROR        4
#define SO_DONTROUTE    5
#define SO_BROADCAST    6
#define SO_SNDBUF       7
#define SO_RCVBUF       8
#define SO_SNDBUFFORCE  32
#define SO_RCVBUFFORCE  33
#define SO_KEEPALIVE    9
#define SO_OOBINLINE    10
#define SO_NO_CHECK     11
#define SO_PRIORITY     12
#define SO_LINGER       13
#define SO_BSDCOMPAT    14
/* To add :#define SO_REUSEPORT 15 */

嗯。看起来它是未定义的或在折旧的最后阶段。

以下是a post on KernelTrap所说的内容:

  

在Linux上,SO_REUSEADDR提供了SO_REUSEPORT在BSD上提供的大部分功能。

     

无论如何,创建多个TCP侦听器绝对没有意义      多个线程可以在同一个侦听器上同时接受()       -
     RémiDenis-Courmont
     http://www.remlab.net/

答案 2 :(得分:4)

试试这个:

#ifdefined (SO_REUSEPORT)
... set this option
#endif

如果您需要设置某些平台(一个OS / X),则需要设置此平台。将多个UDP侦听器绑定到一个端口。

答案 3 :(得分:4)

SO_REUSEPORT被反向移植到RHEL6.5内核2.6.32。

答案 4 :(得分:3)

它是在3.9周期中由Tom Herbert在一系列补丁中添加的,因为你可以看到here,以便更好地支持多线程Web服务器。

如果要将SO_REUSEPORT集成到较旧的内核版本中,可以找到补丁本身here

是的,您可以使用SO_REUSEPORT将套接字绑定到与另一个连接相同的地址和端口,只要初始连接也使用SO_REUSEPORT(以及共享源地址和端口的任何其他连接)。这样做是为了防止恶意应用程序端口劫持。