socket
实现了一个非常简单的boost::asio
服务器。
tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), port));
tcp::socket(io_service) sock;
a.accept(sock);
char data[1024];
boost::system::error_code error;
size_t length = sock->read_some(boost::asio::buffer(data), error);
std::cout << "Got: " << data << std::endl;
它的客户端看起来像:
size_t request_length = strlen(request);
boost::asio::write(s, boost::asio::buffer(request, request_length));
(两者都来自official examples)
当我将hello, world!
发送到套接字时,我立即得到了Got: hello, world!
。但它的缓冲区有1024个字节。怎么知道什么时候读完?
修改
对不起我糟糕的描述。我的问题是read_some()
如何知道应该何时返回。
答案 0 :(得分:7)
read_some()
将从接收缓冲区中读取至少一个字节时返回。如果接收缓冲区中有数据,它将尝试读取尽可能多的指定大小。在单次读取期间,它可能会也可能不会读取整个消息。
在你的情况下,你似乎偶然得到了整个信息。 read_some()
很可能只读取一个字节。你最好从循环中调用read_some()
,将缓冲区的起始索引递增前一次读取的长度。
类似的东西:
size_t length = 0;
while(length < MESSAGE_LENGTH)
{
length += sock->read_some(boost::asio::buffer(&data[lenth], 1024 - length), error);
}
这当然是为了说明而简化。您还应该注意错误条件等。但这应该足以让你开始。