如何让内核在TCP套接字编程中选择范围(1024,5000)中的端口号

时间:2009-05-27 00:56:06

标签: sockets kernel tcpclient tcplistener

当我运行以下代码时:

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 个答案:

答案 0 :(得分:31)

端口号的范围为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 

答案 1 :(得分:6)

查看您的平台的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
...

这是范围内核偷看短暂的端口。