如何区分服务器端口号和客户端端口号?

时间:2019-06-13 10:28:26

标签: networking tcp

我想知道服务器和客户端的间隔端口号是多少。我有一个端口号列表,我需要分离客户端和服务器。

1 个答案:

答案 0 :(得分:0)

您不能仅基于端口号将单独的服务器与客户端分开。

例如

my_addr1.sin_family = AF_INET; 
my_addr1.sin_addr.s_addr = INADDR_ANY; 
my_addr1.sin_port = htons(12010); 
my_addr1.sin_addr.s_addr = inet_addr("10.11.12.13"); 
if (bind(client, (struct sockaddr*) &my_addr1, sizeof(struct sockaddr_in)) == 0) 
    printf("Binded Correctly\n"); 
else
    printf("Unable to bind\n"); 

将您的客户端显式绑定到端口12010(有关完整的演示,请参见https://www.geeksforgeeks.org/explicitly-assigning-port-number-client-socket/)。服务器也是如此:您可以轻松地让服务器侦听某些特定的TCP(或UDP)端口。

幸运的是,在服务名称和传输协议端口号注册表中,有许多众所周知的端口,由IANA(互联网地址分配机构)保存。任何有思想的组织都应该(https://www.ietf.org/rfc/rfc2119.txt)尊重这些任务。但是并不能保证,“客户端”和“服务器”可能与您的期望有所不同(请参见f.e. 123:NTP)。

同样,表现良好的客户端通常使用临时端口号。这些是高端口号,当程序要求可用端口时,操作系统会分发这些端口号。使事情变得复杂:临时端口因操作系统而异:

OS             from         to       comment
AIX            32768        65535
BSD            49152        65535
Slackware      32768        60999    cat /proc/sys/net/ipv4/ip_local_port_range
Windows        5000         65534    may differ per version.

更糟的是,有portmapper,它或多或少地动态地为服务器分配端口号(通常为100001及更高版本)。但是在NFS之外很少使用。

因此,您可以根据IANA众所周知的端口号和OS-s中的临时端口范围进行合理的假设,但不能保证它是正确的。

在Linux上,使用sudo netstat -lpe查看服务器列表。在其他操作系统上,请参见netstat的手册页或文档以获取适当的标志。