C++ boostasio-udp服务器

C++ boostasio-udp服务器,c++,networking,boost,boost-asio,C++,Networking,Boost,Boost Asio,我从boostdoc中看到了官方的异步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::Hand

我从boostdoc中看到了官方的异步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/客户端目标端口,客户端也无法识别响应。

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


您可以创建某种类型的从客户端id(例如
pair
)到调度程序类型(例如
map
)的映射。这就取决于您如何使其线程化以支持并发请求。

UDP是一种无连接传输,因此连接的概念对于UDP来说毫无意义

如果要将数据发送回消息的原始发件人,则需要保留在async_receive_from回调中返回的发送方_端点的副本,并将其传递回async_send_to

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

我建议您阅读一下Beej的《网络编程指南》,以帮助您了解boost ASIO的运作情况。Boost ASIO使事情复杂化了很多


解决方案似乎是使用同一个套接字将响应发送回客户端。看看这个问题的回答:

也许你应该重用现有的绑定。@MarkGarcia在创建的套接字上,我还需要将答复返回给客户端。有多个客户端将在同一套接字上接收数据。UDP没有任何连接。如果需要连接,则必须在UDP之上添加一个连接协议层,例如,为每个对等方添加一个“连接”类,并为每个发送消息的新发件人创建一个新实例。@我使用我的服务器作为dns代理。我想处理多个客户机,代理他们的请求,并返回答案。如果我可以使用某种东西作为boost asio tcp接收器(这次是UDP),我将能够为不同的客户机请求创建不同的UDP套接字。使用boost asio不一定要使用我从客户机接收数据的相同UDP套接字(为了将数据发送回客户机)。理论上,最重要的是您发送到正确的IP和正确的端口号。但是,我从未尝试通过与数据来自的套接字不同的套接字将数据发送回。因此,我不能100%确定它是否能正常工作。更新:实际上,客户端会希望回复从与它发送到的端口相同的服务器端口返回。另请参阅。我可以将映射为remote_ip、remote_port以便重播到该客户端,但如果在重播时我不使用相同的源端口号,客户端将无法识别我的响应您提供的链接已断开。