2010-07-16 9 views
14

Je veux savoir si l'option SO_REUSEPORT est activée dans Linux 2.6 ou pas?SO_REUSEPORT sur Linux

Si je tente de l'utiliser et compiler mon code, j'obtiens l'erreur suivante

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

En utilisant l'option ci-dessus, je suppose que je peux lier deux prises différentes à même IPADRESS et NUMÉRO DE PORT

Répondre

5

De /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. On dirait que c'est indéfini ou sur les dernières étapes d'être déprécié.

Voici ce que dit a post on KernelTrap:

Sur Linux, SO_REUSEADDR fournissent la plupart de ce que SO_REUSEPORT fournit sur BSD.

Dans tous les cas, il est absolument inutile de créer plusieurs écouteurs TCP.
Plusieurs threads peuvent accepter() sur le même écouteur - en même temps.
-
Rémi Denis-Courmont
http://www.remlab.net/

+0

Je ne suis pas sûr de ce que "SO_REUSEPORT" fait dans BSd ... mais j'ai vaguement entendu que je peux même lier deux sockets différents avec la même source IPADRESS et le port source. – codingfreak

4

Essayez ceci:

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

Certaines plates-formes (OS/X pour un) besoin de ceci pour être réglé si vous êtes par exemple lier plusieurs écouteurs UDP à un port.

3

SO_REUSEPORT a été backported au noyau 2.6.32 RHEL6.5.

3

Il a été ajouté au cours du cycle 3.9 dans une série de correctifs par Tom Herbert, comme vous pouvez le voir here, afin de mieux prendre en charge les serveurs Web multithread.

Le correctif lui-même peut être trouvé here si vous voulez intégrer SO_REUSEPORT dans une ancienne version du noyau. Et oui, vous pouvez utiliser SO_REUSEPORT pour lier une socket à la même adresse et au même port qu'une autre connexion, tant que la connexion initiale utilise également SO_REUSEPORT (et toutes les autres connexions partageant l'adresse source et le port). Ceci est fait pour empêcher le piratage de port par des applications malveillantes.