SO_REUSEPORT на linux

Я хочу знать, включена ли опция SO_REUSEPORT в LINUX 2.6 или нет?

Если я попытаюсь использовать его и скомпилировать свой код, я получаю следующую ошибку

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

Ответы

Ответ 2

От /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 */

Хммм. Похож на undefined или на последних этапах амортизации.

Здесь сообщение на KernelTrap говорит:

В Linux SO_REUSEADDR предоставляет большую часть SO_REUSEPORT для BSD.

В любом случае абсолютно нет смысла создавать несколько прослушивателей TCP.
   Несколько потоков могут принимать() на одном и том же слушателе - одновременно.
   - Страница    Реми Денис-Курмонт
   http://www.remlab.net/

Ответ 3

Попробуйте следующее:

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

Некоторые платформы (OS/X для одного) нуждаются в этом, если вы, например, привязка нескольких UDP-прослушивателей к одному порту.

Ответ 4

SO_REUSEPORT был отправлен обратно в ядро ​​RHEL6.5 2.6.32.

Ответ 5

Он был добавлен во время цикла 3.9 в серии патчей Тома Херберта, так как вы можете видеть здесь, чтобы лучше поддерживать многопоточность веб-серверов.

Сам патч можно найти здесь, если вы хотите интегрировать SO_REUSEPORT в более старую версию ядра.

И да, вы можете использовать SO_REUSEPORT для привязки сокета к тому же адресу и порту как к другому соединению, если в исходном соединении также используется SO_REUSEPORT (и любые другие соединения, совместно использующие адрес и порт источника). Это делается для предотвращения захвата портов приложениями-изгоями.