当我运行以下代码时:
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 :(得分: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
...
这是范围内核偷看短暂的端口。