我想知道是否在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和端口号
这个选项是在内核3.9中完成的,参见这个git commit
从/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 */
嗯。 看起来像是未定义的或在折旧的最后阶段。
以下是coreelTrap上的一篇文章 :
在Linux上,SO_REUSEADDR提供了大部分SO_REUSEPORT在BSD上提供的内容。
无论如何,创建多个TCP监听器是绝对没有意义的。
多个线程可以在同一个监听器上同时接受()。
–
RémiDenis-Courmont
http://www.remlab.net/
尝试这个:
#ifdefined (SO_REUSEPORT) ... set this option #endif
有些平台(OS / X for one)需要设置这个功能,例如,如果您将多个UDP侦听器绑定到一个端口。
SO_REUSEPORT被移植到RHEL6.5内核2.6.32。
它是在3.9周期中由Tom Herbert在一系列补丁中添加的,正如您在这里看到的,以便更好地支持多线程的Web服务器。
如果你想将SO_REUSEPORT集成到一个较旧的内核版本中,补丁本身可以在这里找到。
是的,只要初始连接也使用SO_REUSEPORT(以及任何其他共享源地址和端口的连接),就可以使用SO_REUSEPORT将套接字绑定到与另一个连接相同的地址和端口。 这样做是为了防止流氓应用程序劫持端口。