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

Ano*_*ous 15 sockets kernel tcplistener tcpclient

当我运行以下代码时:

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);
Run Code Online (Sandbox Code Playgroud)

根据套接字,我必须得到1024到5000之间的端口号,但是我的端口号大约是30,000.
我该怎么办?

mar*_*k4o 32

端口号的范围为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 
Run Code Online (Sandbox Code Playgroud)


Nik*_*sov 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
...
Run Code Online (Sandbox Code Playgroud)

这些是内核偷看临时端口的范围.

  • 是的,在Linux上我有:sysctl -a 2>/dev/null | grep ip_local_port_range net.ipv4.ip_local_port_range = 32768 61000 (2认同)