TCP套接字怎么知道它已经读取了所有内容



有一个非常简单的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));

(两者都来自官方示例)

当我hello, world!发送到插座时,我立即Got: hello, world!。但它的缓冲区有 1024 个字节。它怎么知道什么时候读完?

编辑:

对不起,我的描述很糟糕。我的问题是read_some()如何知道它应该何时返回。

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);
}

这当然是为了说明而简化的。您还应该注意错误条件等。但这应该足以让你开始。

最新更新