gpt4 book ai didi

c++ - recv windows,每次调用一个字节,什么?

转载 作者:搜寻专家 更新时间:2023-10-31 00:23:21 26 4
gpt4 key购买 nike

C++

#define BUF_LEN 1024

下面的代码在被调用时只接收一个字节然后立即继续。

output = new char[BUF_LEN];
bytes_recv = recv(cli, output, BUF_LEN, 0);
output[bytes_recv] = '\0';

知道如何让它接收更多字节吗?

编辑:连接的客户端是 Telnet。

最佳答案

关于联网要记住的一点是,您将能够读取收到的数据。由于您的代码要求 1024 个字节,而您只读取了 1 个,因此只收到了 1 个字节。

由于您使用的是 telnet 客户端,听起来您已将其配置为字符模式。在这种模式下,只要你输入一个字符,它就会被发送。

尝试在线路模式下重新配置您的 telnet 客户端。在线路模式下,telnet 客户端会等到您按下回车键后才会发送整行。

在我的远程登录客户端上。为此,我首先键入 ctrl-] 以进入 telnet 提示符,然后键入“mode line”以在线模式配置 telnet。

更新

进一步思考,这其实是一个很好的问题。

在现实世界中,您的数据可能会以意想不到的方式变得支离 splinter 。客户端可以进行一次 N 字节的 send() 调用,但数据可能不会以单个数据包的形式到达。如果您的代码可以处理一个接一个地到达的字节,那么您就知道无论数据如何到达,它都能正常工作。

您需要做的是确保在多次接收中积累数据。在您的 recv 调用返回后,您应该将数据附加到一个缓冲区。像这样的东西:

char *accumulate_buffer = new char[BUF_LEN];
size_t accumulate_buffer_len = 0;

...

bytes_recv = recv(fd,
accumulate_buffer + accumulate_buffer_len,
BUF_LEN - accumulate_buffer_len,
0);
if (bytes_recv > 0)
accumulate_buffer_len += bytes_recv;

if (can_handle_data(accumulate_buffer, accumulate_buffer_len))
{
handle_data(accumulate_buffer, accumulate_buffer_len);
accumulate_buffer_len = 0;
}

此代码不断将 recv 累积到缓冲区中,直到有足够的数据可以处理。处理数据后,将长度重置为 0,然后重新开始累积。

关于c++ - recv windows,每次调用一个字节,什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2204224/

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