2013-02-28 114 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