gpt4 book ai didi

java - 如何区分同一 IP 地址上的两个不同 UDP 客户端?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:14:44 25 4
gpt4 key购买 nike

我正在编写一个 UDP 服务器,这对我来说是第一次;我只做了一点 TCP 通信。而且我无法弄清楚如何准确区分哪个用户是哪个用户,因为 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 地址上,因此用户必须有一个单独的标识 key 。
  • 数据包可能会被欺骗,因此应根据其原始 IP 地址检查 key ,如果其他 IP 试图使用该 key ,则忽略该 key 。
  • 客户端的出端口可能会随着数据包的变化而变化。

第三个假设是否正确,或者我可以简单地假设一个用户 = 一个 IP + 端口组合?这是常见的做法,还是我应该继续像我目前所做的那样创建一个特殊的 key ?

我不完全清楚 TCP 如何协商连接,所以如果您认为我应该根据 TCP 对其进行建模,请将我链接到一个很好的教程或有关 TCP 的 SYN/SYNACK/ACK 困惑的内容。

另请注意,如果 IP 发送 0 并且该 IP 已经有待处理 key ,我确实有重新发送 key 的规定;我省略了它以保持代码片段简单。我知道 UDP 不能保证到达,我也计划稍后为主要数据包处理代码添加可靠性。

最佳答案

UDP包头有一个源端口,一般用作回复端口。如果不使用,它应该为零,然后由更高级别的协议(protocol)来确定如何协调多个客户端的请求-响应 Activity 。

关于java - 如何区分同一 IP 地址上的两个不同 UDP 客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2616057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com