【问题标题】:Boost asio - udp serverBoost asio - udp 服务器
【发布时间】:2012-08-28 08:03:33
【问题描述】:

我从 boost doc 中看到了官方的异步 udp 服务器示例。 在那里你创建一个 udp 套接字,将它绑定到本地端口并执行以下操作:

socket(ioService, boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), port))

socket.async_receive_from(buffer(data, max_length), senderEndpoint, boost::bind(&Request::HandleReceiveFrom, this,
    boost::asio::placeholders::error,
      boost::asio::placeholders::bytes_transferred));

如何处理来自客户端的多个并发 udp 连接,因为如果我尝试使用

创建另一个套接字
socket(ioService, boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), port))

我收到绑定错误,因为我已经有一个绑定到同一个端口的套接字。

编辑 我可以使用不同的服务器源端口向客户端发回响应,但即使我将响应发送回相同的客户端 IP/客户端目标端口,它们也不会识别该响应。

【问题讨论】:

  • 也许你应该重用现有的绑定。
  • @MarkGarcia 在创建的套接字上我还需要回复客户端。有多个客户端会在同一个套接字上接收数据。
  • UDP 没有任何连接。如果需要连接,则必须在 UDP 之上添加连接协议层,例如。每个对等点都有一个“连接”类,并为每个发送消息的新发件人创建一个新实例。
  • @MartinJames 我将我的服务器用作 dns 代理。我想处理多个客户,代理他们的请求,并给予答复。
  • 如果我可以使用一些东西作为提升 asio tcp 接受器(这次是 UDP),我将能够为不同的客户端请求创建不同的 udp 套接字

标签: c++ networking boost boost-asio


【解决方案1】:

UDP 是一种无连接传输,因此就 UDP 而言,连接的概念毫无意义。

如果您想将数据发送回消息的发起者,您需要保留 async_receive_from 回调中返回的 sender_endpoint 的副本,并将其传递回 async_send_to。

这也假设客户端也在轮询/阅读并期待回复。它不需要侦听与服务器相同的绑定端口(您不需要在客户端绑定 UDP)。

我建议您阅读 Beej 的网络编程指南,以帮助您了解 boost ASIO 的幕后工作。 Boost ASIO 让事情复杂化了很多恕我直言。

http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#sendtorecv

【讨论】:

  • 您提供的链接已失效。
【解决方案2】:

如果您的客户端将他们的消息发送到您服务器上的同一端口,那么区分它们的唯一方法是通过远程端口或远程端口和远程 ip 的组合。

您创建某种从客户端 ID(例如 pair<remote_ip, remote_port>)到调度程序类型(例如 map< pair<remote_ip, remote_port>, dispatcher>)的映射。然后由您决定是否将其设为线程以支持并发请求。

【讨论】:

  • 因此,使用 boost asio 不一定要使用我从客户端接收数据的相同 udp 套接字(为了将数据发送回客户端)。
  • 理论上,重要的是您发送到正确的 IP 和正确的端口号。但是,我从来没有尝试通过不同的套接字将数据发回,而不是来自它的套接字。所以我不是 100% 确定它会起作用。更新:实际上,客户端会期望回复从与它发送到的服务器端口相同的服务器端口返回。另请参阅this answer
  • 我可以映射 remote_ip、remote_port 以便重播到该客户端,但如果我在重播时不使用相同的源端口号,客户端将无法识别我的响应
【解决方案3】:

似乎解决方案是使用相同的套接字将响应发送回客户端。看看这个问题回复:Use same udp socket for async receive/send

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多