20

次のコードを実行すると:

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 のポート番号を取得しています。
私は何をすべきか?

4

2 に答える 2

36

ポート番号の範囲は0..65535です(ただし、多くの場合、0は特別な意味を持ちます)。元のBSDTCP実装では、ポート1..1023にのみrootバインドでき、動的に割り当てられたポートは1024..5000の範囲から割り当てられました。その他は、非特権の静的割り当てに使用できました。最近では、1024..5000では十分な動的ポートではないことが多く、IANAは動的ポート割り当てに49152..65535の範囲を正式に指定しています。ただし、それでも一部のビジー状態のサーバーには十分な動的ポートではないため、通常、範囲は(管理者によって)構成可能です。最新のLinuxおよびSolarisシステム(サーバーとして使用されることが多い)では、デフォルトのダイナミックレンジは32768から始まります。MacOSXおよびWindowsVistaのデフォルトは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 
于 2009-05-29T04:03:25.160 に答える
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
...

これらは、カーネルがエフェメラル ポートをピークする範囲です。

于 2009-05-27T01:11:21.653 に答える