3

我从 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/客户端目标端口,它们也不会识别响应。

4

3 回答 3

5

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

于 2012-09-09T21:28:05.253 回答
1

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

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

于 2012-08-28T08:39:57.660 回答
1

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

于 2012-09-15T18:02:00.700 回答