【问题标题】:How to let kernel choose a port number in the range (1024,5000) in TCP socket programmingTCP socket编程中如何让内核在(1024,5000)范围内选择一个端口号
【发布时间】:2010-10-29 03:34:23
【问题描述】:

当我运行以下代码时:

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。
我该怎么办?

【问题讨论】:

标签: sockets kernel tcpclient tcplistener


【解决方案1】:

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

这些是内核窥视临时端口的范围。

【讨论】:

  • 是的,在 Linux 上我有:sysctl -a 2>/dev/null | grep ip_local_port_range net.ipv4.ip_local_port_range = 32768 61000
【解决方案2】:

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

【讨论】:

  • 请随时在此处发布有关 IANA 范围太小池的情况的链接。我很好奇这种情况多久发生一次,这似乎是一个奇怪的默认设置,因为它似乎只适用于一些繁忙的服务器,而不是大多数情况。
  • 有趣的是,Win7x64 Ultimate 上的netsh int ipv4 show dynamicport tcp 返回...Start port: 1025Number of Ports : 64510,这是出乎意料的(至少对我而言)
  • 这些是临时端口吗?
  • @ctrl-alt-delor 是的,动态端口和临时端口是同一事物的两个术语。
猜你喜欢
  • 2015-12-20
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 2016-07-21
相关资源
最近更新 更多