【问题标题】:How to identify clients from a pool of clients in the server - Design如何从服务器中的客户端池中识别客户端 - 设计
【发布时间】:2013-02-14 02:33:11
【问题描述】:

好的,所以我有一个正在使用的客户端/服务器库。服务器可以接受来自客户端的多个连接。在每次调用 Accept() 时,如果成功,客户端套接字的句柄将被推送到映射,并使用假定的唯一 ID 作为键。这样当服务器稍后想向特定客户端发送消息时,它会使用此 ID 找到客户端。

我的问题:每个客户的唯一 ID 是什么? IP 地址是不可能的,因为多个客户端可以来自同一个 IP 地址。如果没有,任何人都可以提出其他一些好的设计。谢谢

插图:

ClientSocket workerSock = Server.Accept();

Map.Add(workerSock);

       Map
____________________
|Key   | Value     |
|------------------|
| ?    |workerSock1| ------------------------ client application 1
|------------------|
| ?    |workerSock2| ------------------------ client application 2
|------------------|
| ?    |workerSock3| ------------------------ client application 3
--------------------

场景:服务器想要发送给特定的客户端,所以它必须有一些 ID。

【问题讨论】:

  • 您可以做一些简单的事情,例如将整数句柄返回给您的库的客户端。维护一个内部计数器,该计数器在每次成功连接时递增并正确翻转。这会有一些缺点,但比使用真正“正确”的解决方案(如 RFC 4122 UUID)要轻得多。如果你走这条路,请确保你的句柄生成器是线程安全的!
  • 我能想到的唯一独特方法是为哈希添加端口信息。但不确定它在您的整体方案中如何工作
  • 看来这是最有效和最简单的了,谢谢@Ron

标签: c# c++ sockets network-programming


【解决方案1】:

也许,workerSock.GetHashCode() 可以吗?

【讨论】:

  • 这是一个选项,但是,msdn 声明它不能保证每个对象的哈希值都是唯一的,所以我对此有点不自信
【解决方案2】:

我们在创建网络库networkComms.net 时解决了类似的问题。我们的解决方案是通过 IPEndPoint (MSDN)、Guid (MSDN) 和连接类型(例如TCP、UDP 等。在高级连接握手期间交换 Guid,以便两端都知道对方。

【讨论】:

  • 这似乎是一个很好的解决方案,我已经实现了上面建议的简单整数计数。但我会注意到这一点,因为我很可能迟早会更新我的实现,谢谢@MarcF
  • 我还应该补充一点,最初我们认为我们也可以使用简单的识别系统。当在可扩展环境中实际实施和测试时,这会导致各种噩梦。另外,如果您认为合适,请接受/投票有用的答案。
猜你喜欢
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
相关资源
最近更新 更多