提升asio-udp服务器

Boost asio - udp server

本文关键字:服务器 asio-udp 提升      更新时间:2023-10-16

我看到了boost文档中的官方异步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/客户端目标端口,客户端也不会识别响应。

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

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

您创建了从客户端id(例如pair<remote_ip, remote_port>)到调度程序类型(例如map< pair<remote_ip, remote_port>, dispatcher>)的某种映射。这取决于您使它具有线程化,以便支持并发请求。

看起来,解决方案可以使用相同的套接字向客户端发回响应。看看这个问题的答案:对异步接收/发送使用相同的udp套接字