2012-08-28 75 views
3

我看到了boost文档中的官方async udp服务器示例。 还有你创建一个UDP套接字,将其绑定到本地端口和做这样的事情:Boost asio - 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 /客户端的目标端口的响应。

+2

也许你应该重用现有的绑定。 –

+0

@MarkGarcia创建的套接字我也需要回复给客户端。有多个客户端可以在同一个套接字上接收数据。 – Ghita

+0

UDP没有任何连接。如果你想连接,你将不得不在UDP之上添加一个连接协议层,例如。为每个对等点创建一个“连接”类,并为每个发送消息的新发送者创建一个新实例。 –

回答

1

如果您的客户端将其消息发送到服务器上的同一端口,则区分这些消息的唯一方法是通过远程端口或远程端口和远程IP的组合。

创建从客户端ID(例如pair<remote_ip, remote_port>)某种映射到调度器类型(例如map< pair<remote_ip, remote_port>, dispatcher>)。然后,这是由你来让它线程化,以支持并发请求。

+0

所以,使用boost asio不一定要使用我从客户端接收数据(即为了将数据发回客户端)的相同udp套接字。 – Ghita

+0

理论上所有重要的是你发送到正确的IP和正确的端口号。但是,我从来没有试图通过不同的套接字将数据发送回来,然后从它来的。所以我不能100%确定它会起作用。更新:实际上,客户端会期望回复从与发送给它的服务器端口相同的服务器端口回来。另请参阅[此答案](http://stackoverflow.com/a/763478/75889)。 – StackedCrooked

+0

我可以制作映射remote_ip,remote_port以便重放到该客户端,但是如果我在重播时不使用相同的源端口号,客户端将无法识别我的响应 – Ghita

4

UDP是无连接传输,所以就UDP而言,连接的概念是没有意义的。

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

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

我建议您阅读Beej的网络编程指南,以帮助您了解升级ASIO背后的原因。 Boost ASIO使事情变得复杂化了很多恕我直言。

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