2009-05-27 6 views
12

Cuando ejecuto el siguiente código:Cómo dejar kernel elegir un número de puerto en el rango (1024,5000) en la programación de sockets TCP

struct sockaddr_in sin; 
int addrlen; 
addrlen=sizeof(sin); 
memset(&sin, 0, sizeof(sin)); 
sin.sin_family = AF_INET; 
sin.sin_addr.s_addr=inet_addr("123.456.789.112"); 
sin.sin_port=htons(0); // so that the kernel reserves a unique port for us 
sd_server = socket(PF_INET, SOCK_STREAM, 0); 
bind(sd_server, (struct sockaddr *) &sin, sizeof(sin)); 
getsockname(sd_server,(struct sockaddr*)&sin,&addrlen); 
port=ntohs(sin.sin_port); 
printf("port number = %d\n",port); 

De acuerdo con tomas de corriente, debo conseguir un número de puerto entre 1024 y 5000, pero obtengo números de puerto de alrededor de 30,000.
¿Qué debo hacer?

+0

C POSIX API, ¿deducir de su código? Python: http://stackoverflow.com/questions/1365265/on-localhost-how-to-pick-a-free-port-number || Java: http://stackoverflow.com/questions/2675362/how-to-find-an-available-port || Shell: http://unix.stackexchange.com/questions/55913/whats-the-easiest-way-to-find-an-unused-local-port –

Respuesta

27

Los números de puerto tienen un rango de 0..65535 (aunque a menudo 0 tiene un significado especial). En la implementación original de BSD TCP, solo root se puede unir a los puertos 1..1023, y los puertos asignados dinámicamente se asignaron desde el rango 1024..5000; los otros estaban disponibles para asignación estática sin privilegios. Estos días 1024..5000 a menudo no son suficientes puertos dinámicos, y IANA has now officially designated the range 49152..65535 for dynamic port assignment. Sin embargo, incluso eso no es suficiente puertos dinámicos para algunos servidores ocupados, por lo que el rango suele ser configurable (por un administrador). En los sistemas Linux y Solaris modernos (a menudo utilizados como servidores), el rango dinámico predeterminado ahora comienza en 32768. Mac OS X y Windows Vista tienen por defecto 49152..65535.

linux$ cat /proc/sys/net/ipv4/ip_local_port_range 
32768 61000 

solaris$ /usr/sbin/ndd /dev/tcp tcp_smallest_anon_port tcp_largest_anon_port 
32768 

65535 

macosx$ sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last 
net.inet.ip.portrange.first: 49152 
net.inet.ip.portrange.last: 65535 

vista> netsh int ipv4 show dynamicport tcp 
Protocol tcp Dynamic Port Range 
--------------------------------- 
Start Port : 49152 
Number of Ports : 16384 
+0

No dude en publicar aquí un enlace sobre los casos en los que el rango de IANA es demasiado pequeño. Tengo curiosidad por la frecuencia con la que esto sucede, parece un error por defecto, ya que parece que solo se aplica a algunos servidores ocupados, en la mayoría de los casos. –

+0

Curiosamente, 'netsh int ipv4 muestra dynamicport tcp' en Win7x64 Ultimate returns ...' Puerto de inicio: 1025', 'Número de puertos: 64510' que fue inesperado (al menos para mí) – Basic

4

Mire sysctl para su plataforma. Esto es lo que veo en mi Mac:


[email protected]:~$ sysctl -a|grep port 
... 
net.inet.ip.portrange.hilast: 65535 
net.inet.ip.portrange.hifirst: 49152 
net.inet.ip.portrange.last: 65535 
net.inet.ip.portrange.first: 49152 
net.inet.ip.portrange.lowlast: 600 
net.inet.ip.portrange.lowfirst: 1023 
... 

Estos son los picos rangos de puertos efímeros del núcleo de.

+0

Sí, aquí en Linux tengo: sysctl -a 2>/dev/null | grep ip_local_port_range net.ipv4.ip_local_port_range = 32768 61000 – lothar

Cuestiones relacionadas