使用Socket.LocalEndPoint作为唯一ID是否安全?

时间:2009-06-07 00:03:21

标签: sockets uniqueidentifier

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

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

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

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

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

TY。

4 个答案:

答案 0 :(得分:2)

套接字的唯一性由4个值标识:(本地IP,本地端口,远程IP,远程端口)以及协议栈如何标识连接。

鉴于此,您可以从相同的端口号到相同的端口号具有多个连接,但是到不同的远程地址。通常你必须具体要求 权限使用相同的本地端口进行多次出站连接。

你的例子int clientId =((IPEndPoint)client.RemoteEndPoint).Port;不使用本地端口,而是使用远程端的端口。这当然不是唯一的,因为不同的客户端可能会选择相同的端口。您的服务器端口可能已修复,并且对于所有连接始终都是相同的。因此,如果您想在服务器端使用唯一的东西,则必须使用上面提到的4个值。

但是,如果您在自己设置的连接中只需要自己的客户端应用程序中的唯一标识符,则本地端口将会这样做。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

为什么不使用“client”作为唯一标识符。唯一标识符不必是值类型。

答案 3 :(得分:0)

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

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

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