递归处理来自套接字的数据?

Posted

技术标签:

【中文标题】递归处理来自套接字的数据?【英文标题】:Recursive processing of data from socket? 【发布时间】:2016-02-24 10:36:43 【问题描述】:

在使用 boost asio read_some() 处理来自服务器的数据时,我遇到了一个问题。

数据格式为:83,datalength,data

问题:

我正在从服务器接收数据包,其中数据包可以包含单个数据或多个数据。 此外,在某些情况下,我可以接收 2-3 个数据包中的单个数据。 虽然我已经为此编写了迭代逻辑,但我想知道 some1 是否可以为此类问题建议递归逻辑。 我对递归不是很有信心,因此非常感谢您的帮助。

另外,另一个问题,如果使用 boost asio read_some() 读取数据的最大长度是 1500 字节吗?

【问题讨论】:

我无法想象在这种情况下递归实现在哪里会有所帮助(甚至合理可能......)您能否详细说明您正在寻找递归方式的原因? @JackWhite:好吧!! ,我只是认为使用递归来实现会更容易,因为数据正在一次又一次地处理。由于我的逻辑通过迭代方法变得非常复杂,因此正在寻求简化它。能做到吗? 将数据打散到队列中,监控队列内数据的有效性,当知道好时取出处理。 当您说递归时,您可能是在谈论 asio 的异步部分,即boost::asio::async_read()? @PhilWilliams :我已经将所有传入的数据推送到向量中,并对其进行处理,但正如我提到的处理逻辑变得有点麻烦,因此正在寻找一种简单的方法来做同样的事情。跨度> 【参考方案1】:

根据 cmets,我认为递归在这里不是一个好的选择。我必须坚持我的迭代方法。 感谢every1 的及时回复/建议

【讨论】:

【参考方案2】:

将事物分成 2 个缓冲区,一个用于原始数据,一个用于完整数据包的队列。 一些链接:

while(true) 
    receive data from socket
    append data to sendBuffer
    while( sendbuffer contains a complete packet) 
        move packet to packetQueue();
        removePacket from sendbuffer;
    

【讨论】:

我已经在做类似你建议的事情了。无论如何感谢你的建议。

以上是关于递归处理来自套接字的数据?的主要内容,如果未能解决你的问题,请参考以下文章

获取服务中的调用上下文

监听多个套接字:选择与多线程

来自回调 c# 的未处理异常错误

来自客户端的Getchar()在套接字编程中

来自套接字的 AS3 / AIR readObject() - 如何检查是不是已收到所有数据?

C# 框架中的 UDP 数据报套接字(来自 UWP 的端口)