Как позволить ядру выбрать номер порта в диапазоне (1024,5000) при программировании сокетов TCP - PullRequest
15 голосов
/ 27 мая 2009

Когда я запускаю следующий код:

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

Согласно сокетам, я должен получить номер порта от 1024 до 5000, но я получаю номера портов около 30 000.
Что мне делать?

Ответы [ 2 ]

31 голосов
/ 29 мая 2009

Номера портов имеют диапазон 0,65535 (хотя часто 0 имеет особое значение). В исходной реализации BSD TCP только root может связываться с портами 1..1023, и динамически назначенные порты были назначены из диапазона 1024..5000; остальные были доступны для непривилегированного статического назначения. В наши дни 1024..5000 часто недостаточно для динамических портов, и IANA официально назначил диапазон 49152..65535 для динамического назначения порта . Однако даже для динамичных портов недостаточно загруженных серверов, поэтому диапазон обычно настраивается (администратором). В современных системах Linux и Solaris (часто используемых в качестве серверов) динамический диапазон по умолчанию теперь начинается с 32768. Mac OS X и Windows Vista по умолчанию - 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 
6 голосов
/ 27 мая 2009

Посмотрите на sysctl для вашей платформы. Вот что я вижу на своем Mac:


nickf@goblin:~$ 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
...

Это ядры диапазонов, которые выглядят эфемерными портами.

...