我正在写一个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