Подтвердить что ты не робот

Как позволить ядру выбрать номер порта в диапазоне (1024 500) в программировании сокетов 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.
Что мне делать?

4b9b3361

Ответ 1

Номера портов имеют диапазон 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 

Ответ 2

Посмотрите sysctl для своей платформы. Вот что я вижу на своем 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
...

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