gpt4 book ai didi

sockets - TCP套接字怎么知道它已经读取了所有东西?

转载 作者:可可西里 更新时间:2023-11-01 02:44:33 24 4
gpt4 key购买 nike

boost::asio 实现了一个非常简单的socket 服务器。

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() 如何知道它应该返回的时间。

最佳答案

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

这当然是为了说明而简化的。您还应该注意错误情况等。但这应该足以让您入门。

关于sockets - TCP套接字怎么知道它已经读取了所有东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11143959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com