如何在TCP套接字编程中让内核在(1024,5000)范围内选择端口号 [英] How to let kernel choose a port number in the range (1024,5000) in TCP socket programming

查看:287
本文介绍了如何在TCP套接字编程中让内核在(1024,5000)范围内选择端口号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我运行以下代码时:

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

According to sockets, I must get a port number between 1024 and 5000, but I'm getting port numbers around 30,000.
What should I do?

推荐答案

端口号的范围是0..65535(尽管通常0具有特殊含义).在原始的BSD TCP实现中,只有root可以绑定到端口1..1023,并且动态分配的端口的分配范围是1024..5000;其他可用于非特权静态分配.如今,1024..5000常常不是足够的动态端口,并且 IANA现在已正式指定范围49152. .65535用于动态端口分配.但是,即使对于一些繁忙的服务器来说,动态端口还不够用,因此范围通常是可以配置的(由管理员配置).在现代Linux和Solaris系统(通常用作服务器)上,默认动态范围现在从32768开始.MacOS X和Windows Vista默认为49152..65535.

Port numbers have a range of 0..65535 (although often 0 has special meaning). In the original BSD TCP implementation, only root can bind to ports 1..1023, and dynamically assigned ports were assigned from the range 1024..5000; the others were available for unprivileged static assignment. These days 1024..5000 is often not enough dynamic ports, and IANA has now officially designated the range 49152..65535 for dynamic port assignment. However even that is not enough dynamic ports for some busy servers, so the range is usually configurable (by an administrator). On modern Linux and Solaris systems (often used as servers), the default dynamic range now starts at 32768. Mac OS X and Windows Vista default to 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 

这篇关于如何在TCP套接字编程中让内核在(1024,5000)范围内选择端口号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆