提升asio-udp服务器
Boost asio - udp server
我看到了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套接字
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 以高数据速率发送图像数据超过提升::asio::udp?
- 在thread.hpp上boost asio udp 螺纹= get_id()错误
- Boost Asio udp 解析器返回错误的端点迭代器
- ASIO UDP:类 std::分配器<void>没有名为"construct"的成员
- Boost ASIO UDP 套接字async_receive_from不调用处理程序
- 为什么提升 asio udp 连接会抛出"send: Connection refused"?
- 正在打开带有临时端口的Boost.Asio UDP套接字
- 提升asio-udp服务器
- Asio UDP 套接字接收失败
- 提升 Asio UDP 日间服务器异步接收
- 增强所有(或多个)端口上的 Asio UDP 侦听
- boost asio udp async_read_from buffersize
- boost::asio UDP在同一进程中发送/接收
- boost::asio UDP broadcasting
- 客户端和服务器之间UDP数据包连续流的问题
- 提振.ASIO UDP socket:接收所有报文
- 这个boost-asio UDP广播代码如何仅与本地主机一起工作?
- 提升 Asio UDP 服务器设置套接字以侦听指定的 IP
- 编写客户端和服务器,UDP