gpt4 book ai didi

c++ - recv 有时接收不到全部数据

转载 作者:IT王子 更新时间:2023-10-29 00:46:19 25 4
gpt4 key购买 nike

我有以下问题:这是代码块:

void get_all_buf(int sock, std::string & inStr) {
int n = 1;
char c;
char temp[1024*1024];

bzero(temp, sizeof(temp));

n = recv(sock, temp, sizeof(temp), 0);

inStr = temp;
};

但有时 recv不返回整个数据(数据长度总是小于 sizeof(temp) ),只返回它的一部分。写端总是向我发送完整数据(我用嗅探器得到它)。有什么关系?谢谢。

P.S. 我知道,礼貌建议我查看n ( if (n < 0) perror ("error while receiving data") ),但现在没关系 - 这不是我的问题的原因。

P.S.2 我忘了 - 它会阻塞套接字。

最佳答案

TCP 标准允许对数据包进行分段。实际上,对于几百字节左右的小数据包,这种情况不会发生,但是 1 兆字节的数据几乎肯定会分片。

其次,当您说嗅探器说所有数据都已发送时,是一个数据包还是多个数据包?

良好的网络编程实践要求您不要假设消息以单一 block 的形式到达。两个连续的消息可以作为一个数据包到达(理论上但几乎从不在实践中),即使它们以多个数据包到达也可以作为单次读取来读取。一条消息可能会分成多个数据包,它们可能不会同时全部到达,这可能就是您所看到的情况。

你的程序应该缓冲所有的读取,并有一种机制来确定整个消息何时到达,要么通过定界符(例如,用 CRLFCRLF 定界的 HTTP header ),要么通过字节数(例如,HTTP 正文,其中长度为在 header 中指定)或关闭连接以指示数据结束(例如,当 header 中未指定内容长度时的 HTTP 正文)。可能还有其他机制。

关于c++ - recv 有时接收不到全部数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4509570/

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