2009-05-27 4 views
12

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

+0

C POSIX API, выводимый из вашего кода? 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 –

ответ

27

Номера портов имеют диапазон 0..65535 (хотя часто 0 имеет особое значение). В исходной реализации BSD TCP только root может связываться с портами 1..1023, а динамически назначенные порты были назначены из диапазона 1024..5000; другие были доступны для непривилегированного статического назначения. В эти дни 1024..5000 часто недостаточно динамических портов, а IANA has now officially designated the range 49152..65535 for dynamic port assignment. Однако даже для некоторых загруженных серверов недостаточно динамических портов, поэтому диапазон обычно настраивается (администратором). В современных системах 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 
+0

Не стесняйтесь, разместите ссылку здесь о случаях, когда диапазон IANA слишком мал. Мне любопытно, как часто это происходит, кажется странным по умолчанию, поскольку, похоже, это относится только к некоторым загруженным серверам, а не к большинству случаев. –

+0

Интересно, что 'netsh int ipv4 show dynamicport tcp' на Win7x64 Ultimate возвращает ...' Start port: 1025', 'Number of Ports: 64510', который был неожиданным (по крайней мере для меня) – Basic

4

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

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

+0

Yup, здесь, в Linux У меня есть: sysctl -a 2>/dev/null | grep ip_local_port_range net.ipv4.ip_local_port_range = 32768 61000 – lothar

 Смежные вопросы

  • Нет связанных вопросов^_^