2010-07-16 10 views
14

Voglio sapere se l'opzione SO_REUSEPORT è abilitata in LINUX 2.6 o no ??SO_REUSEPORT su linux

Se cerco di usarlo e compilare il mio codice ottengo seguente errore

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.) 

Utilizzando l'opzione di cui sopra Credo di poter legare due prese differenti alla stessa l'ip e numero di porta

risposta

5

Da /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 */ 

Hmmm. Sembra che sia indefinito o nelle ultime fasi di essere ammortizzato.

Ecco cosa a post on KernelTrap dice:

Su Linux, SO_REUSEADDR forniscono la maggior parte di ciò che SO_REUSEPORT fornisce su BSD.

In ogni caso, non è assolutamente necessario creare più listener TCP.
Più thread possono accettare() sullo stesso listener - allo stesso tempo.
-
Rémi Denis-Courmont
http://www.remlab.net/

+0

Non sono sicuro di cosa faccia "SO_REUSEPORT" in BSd ... ma ho sentito vagamente che posso anche collegare due socket diversi con lo stesso Source IPADRESS e Source Port .. – codingfreak

4

Prova questo:

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

Alcune piattaforme (OS/X per uno) bisogno di questo per impostare se si è per esempio legare più listener UDP a una porta.

3

SO_REUSEPORT stato backport al kernel 2.6.32 RHEL6.5.

3

È stato aggiunto durante il ciclo 3.9 in una serie di patch di Tom Herbert, come si può vedere here, per supportare meglio i server Web multithread.

La patch stessa può essere trovata here se si desidera integrare SO_REUSEPORT in una versione precedente del kernel.

E sì, è possibile utilizzare SO_REUSEPORT per collegare un socket allo stesso indirizzo e porta come un'altra connessione, purché la connessione iniziale utilizzi anche SO_REUSEPORT (e qualsiasi altra connessione che condivide l'indirizzo e la porta di origine). Questo è fatto per prevenire il dirottamento del porto da parte di applicazioni non autorizzate.