在Linux上的SO_REUSEPORT

16

我想知道 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.)

我想使用上述选项可以将两个不同的套接字绑定到相同的IP地址和端口号。

5个回答

8

6

来自 /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 */

嗯,看起来它未定义或即将被弃用。

以下是KernelTrap上的一篇文章所说:

在Linux上,SO_REUSEADDR提供了BSD上SO_REUSEPORT所提供的大部分内容。

无论如何,创建多个TCP监听器毫无意义。
多个线程可以同时在同一个侦听器上accept()。
--
Rémi Denis-Courmont
http://www.remlab.net/


我不确定“SO_REUSEPORT”在BSd中的作用是什么...但是我大致听说我甚至可以将两个不同的套接字绑定到相同的源IP地址和源端口。 - codingfreak

4

SO_REUSEPORT已经被移植到RHEL6.5内核2.6.32中。


4

试试这个:

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

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

3

这个功能是由Tom Herbert在一系列补丁中于3.9周期内添加的,你可以在这里看到,目的是更好地支持多线程Web服务器。

如果你想将SO_REUSEPORT集成到旧的内核版本中,可以在这里找到该补丁。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接