2

编辑!只需读取该读取将阻塞,直到缓冲区已满。我到底如何接收较小的数据包而不必每次发送 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::readsocket 确实有一个成员函数 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 来确保服务器没有发送破碎的数据。服务器没有故障。

4

1 回答 1

3

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

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

于 2013-01-27T03:41:56.537 回答