我正在做一些C编程的客户端服务器套接字的例子。假设服务器监听Port80,即端口4321上的客户端。元组用于区分多个连接。但是,服务器如何区分来自同一客户端的连接呢?我的意思是肯定会有来自客户端的多个应用程序在同一端口访问同一服务器。
有谁能解释一下吗?
谢谢
发布于 2011-07-21 03:39:40
两个客户端不能使用同一端口。如果一个客户端使用端口4321,则另一个客户端必须使用不同的端口。
发布于 2011-07-21 04:54:48
通常的答案是,你从一开始就不会这样做。
客户端通常会使用未绑定套接字连接到服务器,这意味着它没有指定将在其上接收回复的本地端口。服务器将使用bind指定本地端口,然后在该端口上侦听来自客户端的连接。
当客户端使用未绑定的套接字进行连接时,TCP堆栈将选择当前未使用的端口号,并将其分配给该连接。当它向服务器发送请求时,服务器将回复分配的端口号。在客户端,TCP堆栈将查看数据包中的端口号,并将其路由到分配了该端口号的任何进程。
因此,客户机不会使用端口4321 --它将使用堆栈分配给它的任何端口。当同一台机器上的另一个进程连接到同一台服务器时,它也不会使用端口4321 --它将使用分配给它的另一个端口。网络堆栈负责确保每个堆栈都获得唯一的端口号。
值得注意的是,TCP端口分为三个范围。从0到1023是FTP、SMTP、HTTP、POP等服务器的“众所周知”端口。这些端口供服务器使用,操作系统可能会采取一些特殊措施来保护这些端口。例如,一个典型的操作系统需要授予进程某种管理员/根级别的权限,然后它才能使用这些端口。
1024到49151是注册的端口号。与众所周知的端口相比,这些端口的控制通常更为宽松。几乎任何人都可以设置监听它们,但IANA为特定端口维护了一个特定用途的注册表。根据注册表,端口4321用于远程whois协议。
从49152到65535是动态端口--当客户机连接到服务器时,它通常会获得这个范围内的本地端口号。当然,如果您愿意,您可以编写一个服务器并将其绑定到此范围内的端口号(例如,用于测试)。当你这样做的时候/如果你这样做了,堆栈将保持跟踪,这样它就不会试图将该端口用于其他目的。
发布于 2011-07-21 03:40:18
两个客户端不能使用同一个端口,所以没有实际意义。
但是,如果您正在定义自己的协议,为什么不在客户端和服务器之间来回传递ClientID呢?客户端可以使用无效的client_id进行请求,并且服务器可以在ack中分配一个。
https://stackoverflow.com/questions/6767455
复制相似问题