0

当服务器通过 tcp/ip 连接接受客户端时,会创建一个新套接字。

使用 LocalEndPoint 端口(从客户端的角度)作为 id 是否安全?示例(从服务器的角度来看):

int clientId = ((IPEndPoint)client.RemoteEndPoint).Port;

在我的本地机器上,端口似乎是唯一的,但是在不同机器上有多个客户端时,情况可能并非总是如此。

我的第二个问题:假设端口不能像唯一 id 一样使用,服务器(以及协议栈)如何区分两个客户端套接字(从服务器的角度来看)。

泰。

4

4 回答 4

2

套接字的唯一性由 4 个值标识:(本地 IP、本地端口、远程 IP、远程端口),这就是协议栈识别连接的方式。

鉴于此,您可以有多个从相同端口号到相同端口号但例如到不同远程地址的连接。通常,您必须专门请求权限才能将同一本地端口用于 1 个以上的出站连接。

您的示例 int clientId = ((IPEndPoint)client.RemoteEndPoint).Port; 不使用本地端口,而是使用远程端的端口。这当然不是唯一的,因为不同的客户端可能碰巧选择了相同的端口。您的服务器端口可能是固定的,并且对于所有连接将始终相同。因此,如果您想在服务器端获得独特的东西,您必须使用上面提到的 4 个值。

但是,如果您只需要在您自己的客户端应用程序中在您自己设置的连接中使用唯一标识符,则本地端口就可以了。

于 2009-06-07T00:18:58.367 回答
1

不要为每个(接受的)连接使用远程端点 - 创建一个 GUID。

将 GUID 传递回客户端套接字 - 让客户端保存它(比 HTTP 会话好得多)并将 GUID 添加到指向您的任何后续 HTTP 标头:)

然后!!对 HastTable<> 的完美需求!!!我只知道几种情况!

于 2009-06-07T02:04:48.047 回答
0

为什么不直接使用“客户端”作为唯一标识符。唯一标识符不必是值类型。

于 2009-06-07T00:10:12.520 回答
0

第一个问题的简短回答可能是否定的。客户端操作系统通常会从一个范围内选择一个端口。即使该范围是 40-50,000 大,如果您的服务器足够繁忙,迟早您可能会有来自不同客户端的相同端口。如果它不是一个繁忙的服务器,你可能会很幸运。

套接字基于地址/端口/协议对相互区分。来自客户端和服务器的这些值的组合集将是唯一的。

为什么不能只使用客户端地址和端口作为临时 ID?

于 2009-06-07T00:30:26.847 回答