0
這是一個C++服務器應用程序,它可以與所有基於UDP協議的客戶端進行通信。當用戶從客戶端登錄到服務器時,客戶端應用程序向服務器註冊一個UDP通道,並且該通道採用固定格式:IP +端口,這意味着如果IP保持不變,則無論用戶登錄到客戶端寄存器同一頻道。基於UDP的服務器無法區分不同的用戶
服務器的套接字層維護一個心跳機制,如果它在3分鐘內沒有收到來自該信道的任何心跳包,將刪除該信道。一切正常,直到客戶端關閉,例如網線被拔掉。看看下面的一幕:
1. User-A logs into server. The Client registers channel (IP:Port)
to the server. Because the UDP channel is alive, so the Server
sets the User status of User-A as Online.
2. Kill the client process, and within 3 minutes(before the channel
timeouts in server), let User-B logs into server from the same
computer. Because the IP remains unchanged, so actually the client
registers a same (IP:PORT) pair to the server as it did when User-A
logs in.
3. Since the Server receives packets from (IP:PORT), so it considers
User-A is still alive, thus setting the user status of User-A as
Online which is not right anymore.
在上述情況下,服務器無法區分不同的用戶從同一臺計算機上,這會導致錯誤的用戶狀態記錄下來。有人知道如何解決這個問題嗎?
您可以實施某種認證。 – smeso
將通道簽名從「(IP:PORT)」擴展到「(IP:PORT:USER)」 –