2013-02-28 65 views
2

好吧,我有一个客户端/服务器库,我正在工作。服务器可以接受来自客户端的多个连接。在每次调用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。

+2

你可以做一些简单的操作,例如将整数句柄提供给库的客户端。维护一个内部计数器,在每次成功连接时递增并正确翻转。这会有一些缺点,但比使用真正的“正确”解决方案(如RFC 4122 UUID)要轻得多。如果你走这条路线,确保你的手柄发电机是螺纹安全的! – 2013-02-28 02:33:24

+0

我能想到的唯一方法就是为散列添加端口信息。但不知道它如何在你的整体方案中工作 – Pradheep 2013-02-28 03:01:48

+0

似乎这是最有效和最简单的,谢谢@Ron – TravellingGeek 2013-02-28 03:02:48

回答

3

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

+0

这似乎是一个很好的解决方案,我已经实现了上面提到的一个简单的整数计数。但我会注意到这一点,因为我很可能迟早会更新我的实现,谢谢@MarcF – TravellingGeek 2013-03-01 06:56:50

+0

我还应该补充说,最初我们认为我们也可以用一个简单的识别系统逃脱。这实际上导致了在可伸缩环境中实现和测试时的各种恶梦。此外,如果您认为适当,请接受/投票有用答案。 – MarcF 2013-03-01 11:06:15

1

也许,workerSock.GetHashCode()会做什么?

+0

这是一个选项,但是, msdn声明它并不保证每个对象都有唯一的哈希值,所以我对此有点不自信 – TravellingGeek 2013-02-28 02:45:01