我正在寫一個UDP服務器,這是我的第一個;我只做了一點TCP通信。而且我很難搞清楚如何區分哪個用戶是哪個用戶,因爲UDP只處理數據包而不處理連接,因此我無法確切知道我與誰進行通信。如何區分同一個IP地址上的兩個不同的UDP客戶端?
這是我目前的服務器循環的僞代碼:
DatagramPacket p;
socket.receive(p); // now p contains the user's IP and port, and the data
int key = getKey(p);
if(key == 0) { // connection request
key = makeKey(p);
clients.add(key, p.ip);
send(p.ip, p.port, key); // give the user his key
} else { // user has a key
// verify key belongs to that IP address
// lookup the user's session data based on the key
// react to the packet in the context of the session
}
在設計這個,我牢記以下幾點:
- 多個用戶可以在同一個IP地址存在,因路由器的存在,因此用戶必須有一個單獨的識別密鑰。
- 數據包可能被欺騙,因此應該根據其原始IP地址檢查密鑰,並在其他IP嘗試使用該密鑰時忽略該密鑰。
- 客戶端的出站端口可能在數據包之間發生更改。
第三個假設是否正確,或者我可以簡單地假設一個用戶=一個IP +端口組合?這是通常完成的,還是應該繼續創建一個像我目前正在做的特殊鍵?
我並不完全清楚TCP協商連接的方式,所以如果您認爲我應該將其建模爲TCP,那麼請將我鏈接到一個很好的教程或關於TCP的SYN/SYNACK/ACK混亂的內容。
另請注意,如果IP發送0,並且該IP已具有掛起的密鑰,我確實有重新發送密鑰的規定;我省略了它以保持簡單的代碼片段。我知道UDP不能保證到達,我打算以後也爲主分組處理代碼增加可靠性。
這是典型的UDP協議的工作原理。預計單個客戶端將在單個「事務」或「會話」期間繼續使用相同的端口。 – caf 2010-04-11 11:08:34
準確地說,我的觀點。 – EJP 2010-04-29 01:05:59