Как разрешить ядру выбирать номер порта в диапазоне (1024,5000) в программировании сокетов 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);

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


person Anonymous    schedule 27.05.2009    source источник
comment
C POSIX API, вывод из вашего кода? Python: stackoverflow.com/questions/1365265/ || Java: stackoverflow.com/questions/2675362/ || Оболочка: unix.stackexchange.com/questions/55913/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 19.12.2015


Ответы (2)


Номера портов имеют диапазон 0..65535 (хотя часто 0 имеет особое значение). В исходной реализации TCP BSD только 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 
person mark4o    schedule 29.05.2009
comment
Не стесняйтесь размещать здесь ссылку о случаях, когда диапазон IANA является слишком маленьким пулом. Мне любопытно, как часто это происходит, кажется странным по умолчанию, поскольку оно, похоже, применимо только к некоторым загруженным серверам, а не в большинстве случаев. - person August Lilleaas; 17.06.2012
comment
Интересно, что netsh int ipv4 show dynamicport tcp на Win7x64 Ultimate возвращает ... Start port: 1025, Number of Ports : 64510, что было неожиданно (по крайней мере, для меня) - person Basic; 05.07.2013
comment
Это эфемерные порты? - person ctrl-alt-delor; 21.07.2020
comment
@ ctrl-alt-delor Да, динамические порты и эфемерные порты - это два термина для одного и того же. - person mark4o; 22.07.2020

Посмотрите на 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
...

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

person Nikolai Fetissov    schedule 27.05.2009
comment
Ага, здесь, в Linux, у меня есть: sysctl -a 2 ›/ dev / null | grep ip_local_port_range net.ipv4.ip_local_port_range = 32768 61000 - person lothar; 27.05.2009