2009-05-27 23 views
12

Khi tôi chạy đoạn mã sau:Làm thế nào để cho kernel chọn một số cổng trong khoảng (1024,5000) trong lập trình socket TCP

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); 

Theo ổ cắm, tôi phải có được một số cổng giữa 1024 và 5000, nhưng tôi nhận được số cổng khoảng 30.000.
Tôi nên làm gì?

+0

C POSIX API, khấu trừ mã của bạn? Python: http://stackoverflow.com/questions/1365265/on-localhost-how-to-pick-a-free-port-number || Java: http://stackoverflow.com/questions/2675362/how-to-find-an-available-port || Shell: http://unix.stackexchange.com/questions/55913/whats-the-easiest-way-to-find-an-unused-local-port –

Trả lời

27

Số cổng có phạm vi 0..65535 (mặc dù thường 0 có ý nghĩa đặc biệt). Trong triển khai TCP BSD gốc, chỉ root mới có thể liên kết với cổng 1..1023 và các cổng được gán động được gán từ dải 1024..5000; những người khác đã có sẵn cho nhiệm vụ tĩnh không có đặc quyền. Những ngày này 1024..5000 thường không đủ cổng động và IANA has now officially designated the range 49152..65535 for dynamic port assignment. Tuy nhiên, ngay cả điều đó cũng không đủ cổng động cho một số máy chủ bận, do đó phạm vi thường có thể cấu hình (bởi người quản trị). Trên các hệ thống Linux và Solaris hiện đại (thường được sử dụng làm máy chủ), phạm vi động mặc định hiện bắt đầu tại 32768. Mac OS X và Windows Vista mặc định là 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 
+0

Hãy đăng liên kết tại đây về các trường hợp phạm vi IANA quá nhỏ. Tôi tò mò như thế nào thường xuyên điều này xảy ra, có vẻ như một mặc định lạ để có kể từ khi nó dường như chỉ áp dụng cho một số máy chủ bận rộn, không phải hầu hết các trường hợp. –

+0

Điều thú vị là, 'netsh int ipv4 hiển thị dynamicport tcp' trên Win7x64 Ultimate trả về ...' Cổng bắt đầu: 1025', 'Số cổng: 64510' đã bất ngờ (ít nhất là đối với tôi) – Basic

4

Nhìn vào sysctl cho nền tảng của bạn. Dưới đây là những gì tôi thấy trên máy Mac của tôi:


[email protected]:~$ 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 
... 

Đây là các cổng hạt nhân tạm thời.

+0

Yup, ở đây trên Linux tôi có: sysctl -a 2>/dev/null | grep ip_local_port_range net.ipv4.ip_local_port_range = 32768 61000 – lothar

Các vấn đề liên quan