【问题标题】:Reading arbitrarily length messages? How do you know your finished阅读任意长度的消息?你怎么知道你的完成
【发布时间】:2013-01-27 03:19:03
【问题描述】:

编辑! 只需读取该读取将阻塞,直到缓冲区已满。我到底如何接收更小的数据包而不必每次发送 1MB(我的最大缓冲区长度)? 如果我想发送任意长度的消息怎么办?

在 Java 中,您似乎可以毫无顾虑地发送一个 char 数组。但是在带有 boost 套接字的 C++ 中,我似乎要么必须继续调用socket.read(...),直到我认为我拥有一切,要么发送我的完整缓冲区长度的数据,这似乎很浪费。

关于上下文的旧原始问题。

再一次提升插座让我完全难住了。我在用 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket;我 使用 boost SSL 示例作为指导,但我有专门的线程 而不是进行异步调用。

套接字的第一个socket.read_some(...) 很好,它读取 所有字节。之后它读取 1 个字节,然后读取所有其余字节 下一个 socket.read_some(...) 这让我很困惑。我那时 注意到 read_some 通常有这种行为。所以我搬到 boost::asio::read 因为套接字确实有一个成员函数 read 让我吃了一惊。但是注意到 boost::asio 有一个读取函数 需要一个套接字和缓冲区。但是它是永久阻塞的。

//read blocking data method
//now
bytesread = boost::asio::read(socket,buffer(readBuffer, max_length)); << perminatly blocks never seems to read.
//was 
//bytesread =  socket.read_some(buffer(readBuffer, max_length)); << after the 1st read it will always read one byte and need another

socket.read_some(...) 调用以读取其余部分。

我需要做什么才能使boost::asio::read(...) 工作?

注意 .. 我使用了 wireshark 来确保服务器不是 发送分解的数据。服务器没有故障。

【问题讨论】:

    标签: c++ sockets boost boost-asio


    【解决方案1】:

    在合并缓冲区的循环中使用read_some() 读取,直到获得完整的应用程序消息。假设您可以取回 1 字节和缓冲区全长之间的任何内容。

    关于“知道何时完成” - 进入您的应用程序级协议,它可以使用分隔消息、固定长度消息、告诉有效负载长度的固定长度标头等。

    【讨论】:

    • 不会在最后阻塞并让我的线程陷入僵局吗?或者我是否定义了一些东西来确定我的消息的结尾,比如 null 终止一个字符串?
    猜你喜欢
    • 2018-08-08
    • 1970-01-01
    • 2011-11-18
    • 2016-11-05
    • 2023-03-15
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多