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)
看看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)
这些是内核偷看临时端口的范围.