Ответ 1
эти параметры были выполнены в ядре 3.9, см. этот git commit
Я хочу знать, включена ли опция 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
эти параметры были выполнены в ядре 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 */
Хммм. Похож на undefined или на последних этапах амортизации.
Здесь сообщение на KernelTrap говорит:
В Linux SO_REUSEADDR предоставляет большую часть SO_REUSEPORT для BSD.
В любом случае абсолютно нет смысла создавать несколько прослушивателей TCP.
Несколько потоков могут принимать() на одном и том же слушателе - одновременно.
- Страница Реми Денис-Курмонт
http://www.remlab.net/
Попробуйте следующее:
#ifdefined (SO_REUSEPORT)
... set this option
#endif
Некоторые платформы (OS/X для одного) нуждаются в этом, если вы, например, привязка нескольких UDP-прослушивателей к одному порту.
SO_REUSEPORT был отправлен обратно в ядро RHEL6.5 2.6.32.
Он был добавлен во время цикла 3.9 в серии патчей Тома Херберта, так как вы можете видеть здесь, чтобы лучше поддерживать многопоточность веб-серверов.
Сам патч можно найти здесь, если вы хотите интегрировать SO_REUSEPORT в более старую версию ядра.
И да, вы можете использовать SO_REUSEPORT для привязки сокета к тому же адресу и порту как к другому соединению, если в исходном соединении также используется SO_REUSEPORT (и любые другие соединения, совместно использующие адрес и порт источника). Это делается для предотвращения захвата портов приложениями-изгоями.