Sockets 将Socket.LocalEndPoint用作唯一id是否安全?

Sockets 将Socket.LocalEndPoint用作唯一id是否安全?,sockets,uniqueidentifier,Sockets,Uniqueidentifier,当服务器通过tcp/ip连接接受客户机时,将创建一个新套接字 使用LocalEndPoint端口(从客户端角度)作为id安全吗? 示例(从服务器角度): intclientid=((IPEndPoint)client.RemoteEndPoint).Port 在我的本地机器上,端口似乎是唯一的,但是对于不同机器上的多个客户端,情况可能并不总是如此 我的第二个问题: 假设端口不能像唯一id那样使用,服务器(以及协议栈)如何区分两个客户端套接字(从服务器的角度) TY.为什么不使用“客户端”作为唯一

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

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

intclientid=((IPEndPoint)client.RemoteEndPoint).Port

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

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


TY.

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

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

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

鉴于此,您可以从同一端口号连接到同一端口号,但例如连接到不同的远程地址。通常,您必须明确要求 对多个出站连接使用同一本地端口的权限

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


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

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

鉴于此,您可以从同一端口号连接到同一端口号,但例如连接到不同的远程地址。通常,您必须明确要求 对多个出站连接使用同一本地端口的权限

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


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

第一个问题的简短答案可能是否定的。客户端操作系统通常会从一系列端口中选择一个端口。即使这个范围是4万到5万,如果您的服务器足够忙,早晚您可能会有来自不同客户端的相同端口。如果它不是一个繁忙的服务器,你可能会很幸运

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


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

第一个问题的简短答案可能是否定的。客户端操作系统通常会从一个范围中选择一个端口。即使这个范围是4万到5万,如果您的服务器足够忙,早晚您可能会有来自不同客户端的相同端口。如果它不是一个繁忙的服务器,你可能会很幸运

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


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

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

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


那么!!对搭扣的完美需求!!!我只知道几种情况

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

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


那么!!对搭扣的完美需求!!!我只知道几种情况

多亏了诺斯、达克、约翰·桑德斯和迪维奇,你的答案都很好。这很有帮助。再次感谢。感谢诺斯、达克、约翰·桑德斯和迪维西,你们的答案都很好。这很有帮助。再次感谢。