修改! 只需读取读取将阻塞,直到缓冲区已满。我怎么接收小包而不必每次发送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
因为socket确实有一个成员函数读取 让我吃了一惊。但是注意到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来确保服务器不是 发送数据。服务器没有故障。
答案 0 :(得分:3)
在合并缓冲区的循环中使用read_some()
进行读取,直到获得完整的应用程序消息。假设您可以在缓冲区的1个字节和全长之间取回任何内容。
关于“知道何时完成” - 进入应用程序级协议,它可以使用分隔消息,固定长度消息,定义有效负载长度的固定长度标头等。