阅读任意长度的消息?你怎么知道你的完成

时间:2013-01-27 03:19:03

标签: c++ sockets boost boost-asio

修改! 只需读取读取将阻塞,直到缓冲区已满。我怎么接收小包而不必每次发送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来确保服务器不是   发送数据。服务器没有故障。

1 个答案:

答案 0 :(得分:3)

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

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