1 回答
TA贡献1934条经验 获得超2个赞
您将接收到的数据视为 C 字符串(以 0 字节结尾的字节序列),这是不正确的。
recv
接收一些字节并将它们放入buffer
. 假设它收到了 200 字节。
那么你就这样做strstr(buffer,eom_flag);
。strstr
不知道已收到 200 字节。strstr
从缓冲区的开头开始,一直查找,直到找到 、 或 0 字节。即使您没有收到,它也有可能在缓冲区的其他 824 字节中找到 a。
那你就做吧output += buffer;
。这也将缓冲区视为以 0 字节结尾。这将查看整个缓冲区(不仅仅是前 200 个字节)以查找 0 字节。然后它将把截至该点的所有内容添加到output
. 同样,它可能会在缓冲区的最后 824 字节中找到 0 字节,并添加过多的数据。它可能根本在缓冲区中找不到 0 字节,然后它将继续从存储在buffer
内存中的其他变量中添加额外的数据。或者它可能会在前 200 个字节中找到 0 字节,并在那里停止(但前提是您发送了 0 字节)。
您应该做的是注意接收到的字节数(即iResult
)并将这些字节添加到输出中。你可以使用:
output.insert(output.end(), buffer, buffer+iResult);
另外(正如 Phillipe Thomassigny 在评论中指出的那样),“”可能不会立即全部收到。您可能会单独收到“”。您应该检查是否output
有“”,而不是检查是否buffer
有“”。(这对性能的影响留给读者作为练习)
顺便说一下,这一行目前没有做任何事情:
output.erase(std::find(output.begin(), output.end(), '\0'), output.end());
因为 '\0' 永远不会被添加到output
,因为对于output += buffer;
,'\0' 告诉它在哪里停止添加。
- 1 回答
- 0 关注
- 130 浏览
添加回答
举报