2009-05-27 57 views
12

當我運行下面的代碼:如何讓內核選擇在TCP套接字編程的範圍內(1024,5000)端口號

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 ||殼:http://unix.stackexchange.com/questions/55913/whats-the-easiest-way-to-find-an-unused-local-port – 2015-12-19 15:28:10

回答

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範圍太小的情況的鏈接。我很好奇這種情況發生的頻率,似乎是一個奇怪的默認值,因爲它似乎只適用於一些繁忙的服務器,而不是大多數情況。 – 2012-06-17 13:33:29

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

是的,這裏在Linux上我有:sysctl -a 2>/dev/null | grep ip_local_port_range net.ipv4.ip_local_port_range = 32768 61000 – lothar 2009-05-27 01:36:30