【问题标题】:UDP handling multiple clientsUDP处理多个客户端
【发布时间】:2011-11-22 17:17:21
【问题描述】:

我似乎不知道如何为我的 UDP 服务器执行下一步。到目前为止,一个客户端连接,然后它来回发送数据,但是当另一个客户端连接时,服务器将从新客户端获取数据并将其发送给另一个客户端。

我将检查收到的消息是否来自新客户端,如果是,则给该客户端一个标识符,服务器使用该标识符进行某些处理。这是正确的方法吗?如果是这样,你怎么做?我知道 recvfrom 有“sockaddr *from”字段,我假设用客户端的数据填充该字段,但我如何使用该数据?

谢谢

【问题讨论】:

  • 您可以使用 recvfrom 记录每个客户端的 ip,然后检查传入数据的来源,将调用映射到正确的客户端。或者至少是这样的=)
  • 我试图这样做,但它包含在“IN_ADDR”结构中,我不知道哪个成员是 IP
  • 使用 TCP。 UDP 是一种无连接协议。
  • 这是一个网络游戏,UDP更适合

标签: c++ networking udp


【解决方案1】:
sockaddr_in saddr;
int length = sizeof(saddr);
int read = recvfrom(your_socket, buff, 4096, 0, (sockaddr*)&saddr, &length);
if(read != -1) {
   // now saddr contains the address of the client
   // the g_addr is a previously captured client address
   if(saddr.sin_addr.S_un.S_addr = g_addr.sin_addr.S_un.S_addr) {
      // returning client?
   } else {
      // not yet seen client, so store address
   }
}

【讨论】:

  • 我有这部分工作,我如何将“saddr”与其他客户进行比较?
  • 更好地使用struct sockaddr_storage - 它保证可以容纳所有大小的有效sockaddrs。
【解决方案2】:

UDP 是无连接的。尝试使用 TCP。你为什么决定使用UDP?你的限制是什么?

【讨论】:

  • 如果只是问题/答案,则无需连接。如果某些东西丢失了,客户端希望能注意到它并自行重试。
【解决方案3】:

recvfrom 函数中的地址将填充来自客户端的源信息。如果是 udp,它将为您提供地址和端口,对于 IPv4,可以轻松地将其转换为 long long 并存储为标识符。 IPv4 是 4 个字节 + 端口 2 个字节。您需要将指针转换为 sockaddr_in,然后获取 sin_port 和 sin_addr 的值。

【讨论】:

  • IP 地址是共享的 - 因为地址范围的限制。
  • @EdHeal - 是的,但我不明白如果标识符存储为:|---4 字节 IP ---|-- 2 字节端口 -- |- -- 2 字节无 --- |。在 NAT 情况下,您不使用 UDP 与服务器通信。
  • 为什么不呢?如果您有 UDP 端口转发,即使这样也可以。
猜你喜欢
  • 1970-01-01
  • 2014-05-23
  • 2013-04-21
  • 2021-04-09
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
相关资源
最近更新 更多