2012-07-20 112 views
5

我做了我的UDP服务器和客户端的boost :: ASIO UDP套接字接收。在我开始发送更多数据报之前,一切看起来都很好他们正确地从客户端到服务器。但是,他们在我的缓冲中融合成一个信息。如何分割与升压ASIO UDP套接字团结报

我使用

udp::socket::async_receivestd::array<char, 1 <<18>缓冲

用于制造异步请求。并通过回调

void on_receive(const error_code& code, size_t bytes_transferred)

接收数据。如果我发送数据往往(每10毫秒),我同时收到几个到数据包缓冲区我用的回调以上。问题是 - 如何分开他们?注意:我的UDP数据报有可变长度。我不想在大小上使用附加头,因为它会使我的代码对第三方数据报无用。

+0

你能告诉你的代码? – 2012-07-20 18:32:50

+0

在'on_receive'消息中使用用户提供的回调函数,该函数处理单个接收数据包中包含的所有消息。 – Chad 2012-07-23 14:45:35

+0

当然,它可以在这里找到:[udp2tcp_tunnel](https://github.com/valery-l/udp2tcp_tunnel)。它正在进行中 - 还有一个乒乓服务器(通过TCP从客户端发送,通过UDP从服务器接收相同的测试消息)。在我看来,我发现了这个问题。如果我在**缓存器中的**派几个缓冲区由“basic_datagram_socket :: async_send_to(buffer_sequence,处理程序)”,它会来的** **一个数据报(不** **一个对数据报**每个缓冲区* *)。 – 2012-07-23 14:57:33

回答

0

我相信这是在路上升压限制:: ASIO处理无国籍的数据流。当使用boost :: asio作为串行接口时,我注意到了完全相同的行为。当我发送差距较大的数据包时,我在单独的回调中收到每个数据包。随着数据包大小的增长以及数据包之间的差距因此减少,它达到了一个阶段,它只在缓冲区满时执行回调,而不是在收到单个数据包之后执行回调。

如果您确切知道预期数据报的大小,那么您的解决方案限制输入缓冲区大小是一个非常合理的解决方案,正如您先前知道缓冲区需要多大。

如果拥堵是由具有传输多个不同的数据包类型,所以你不能预先分配正确大小的缓冲区来了,那么你可能在创建每个事务类型的不同端口不同的插座。这有点“黑客”,但考虑到短暂端口可用性的几乎无限性,只要您不使用20,000种不同的数据包类型,这可能会帮助您实现良好的状态。