我有一个客户端使用此功能向我发送数据:
void CServerRetrieve::Send(char *buf, DWORD size, int flags)
{
unsigned char *zlib;
unsigned long szzlib;
m_zlib.Deflate((unsigned char*)buf, size + 1, &zlib, &szzlib); // include the terminating 0 char
char zbuf[5];
zbuf[0] = 'Z';
memcpy(&zbuf[1], &szzlib, 4);
send(m_Socket, zbuf, 5, flags);
send(m_Socket, (char*)zlib, szzlib, flags);
delete [] zlib;
}
我想使用Boost :: asio接收这些数据,但是我不确定应该将哪种类型的缓冲区传递给socket.async_receive
以便它接收这些数据?
我尝试了std::vector<char>
和std::vector<std::string>
,但我的缓冲区中没有收到任何数据?
有人可以帮助我解决我做错的事吗?
void tcp_connection::start()
{
socket_.async_receive(boost::asio::buffer(buff), boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
void tcp_connection::handle_read(const boost::system::error_code& err, size_t bytes_transferred)
{
if (!err || err == boost::asio::error::message_size)
{
size_t sz = buff.size(); //always 0!
}
}
答案 0 :(得分:1)
您正在接收压缩数据这一事实对Boost.Asio无关紧要。假设您知道要接收的数据大小,std::vector<char>
可以接收压缩数据。在调用resize
之前,您需要async_receive
它只是确保在调用完成处理程序之前,此缓冲区不会超出范围。这个概念在async_read
documentation中解释。
<强>缓冲器强>
将要读取数据的一个或多个缓冲区。总和 缓冲区大小表示 要读取的最大字节数 流。虽然是缓冲区 可以根据需要复制对象, 底层内存的所有权 块被调用者保留, 必须保证它们仍然存在 在调用处理程序之前有效。
答案 1 :(得分:0)
我假设buff是你的std :: vector?在这种情况下,在async_receive之前,您应该使用您想要读取的大小初始化它,例如
buff.resize(5);
如果您知道要接收的邮件大小,也应该考虑使用async_read。在任何情况下,您都需要为缓冲区设置大小。