2009-05-27 2 views
12

Wenn ich den folgenden Code ausführen:Wie Kernel eine Portnummer im Bereich (1024,5000) in TCP-Socket-Programmierung wählen lassen

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

Steckdosen nach, habe ich eine Portnummer zwischen 1024 erhalten müssen und 5000, aber ich bekomme Portnummern um 30.000.
Was soll ich tun?

+0

C POSIX-API, abgeleitet von Ihrem Code? 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 –

Antwort

27

Portnummern haben einen Bereich von 0..65535 (obwohl oft 0 eine besondere Bedeutung hat). In der ursprünglichen BSD-TCP-Implementierung kann nur root an Ports 1..1023 und dynamisch zugewiesene Ports aus dem Bereich 1024..5000 zugewiesen werden; die anderen waren für die unprivilegierte statische Zuweisung verfügbar. Heutzutage sind 1024.5000 oft nicht genug dynamische Ports und IANA has now officially designated the range 49152..65535 for dynamic port assignment. Aber selbst das ist nicht genug dynamische Ports für einige ausgelastete Server, daher ist der Bereich normalerweise konfigurierbar (durch einen Administrator). Auf modernen Linux- und Solaris-Systemen (die häufig als Server verwendet werden) beginnt der Standarddynamikbereich jetzt bei 32768. Mac OS X und Windows Vista sind standardmäßig auf 49152..65535 eingestellt.

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

Fühlen Sie sich frei, hier einen Link zu den Fällen zu veröffentlichen, in denen die IANA-Reihe zu klein ist. Ich bin gespannt, wie oft das passiert, scheint ein seltsamer Standard zu sein, da es scheint, nur für einige ausgelastete Server zu gelten, nicht die meisten Fälle. –

+0

Interessanterweise kehrt 'netsh int ipv4 zeigt dynamicport tcp' auf Win7x64 Ultimate zurück ... 'Startport: 1025',' Anzahl der Ports: 64510' was unerwartet war (zumindest für mich) – Basic

4

Betrachten Sie sysctl für Ihre Plattform. Hier ist, was ich auf meinem Mac sehe:


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

Dies sind die Bereiche Kernel Peeks ephemeren Ports aus.

+0

Yup, hier auf Linux habe ich: sysctl -a 2>/dev/null | grep ip_local_port_range net.ipv4.ip_local_port_range = 32768 61000 – lothar