我在使用 unix 本地套接字时遇到问题。在读取比我的临时缓冲区大小长的消息时,请求花费的时间太长(可能无限期)。
经过一些测试后添加: 在 ::recv 处冻结仍然存在问题。当我向 UNIX 套接字发送 (1023*8) 字节或更少时 - 一切正常,但是当发送超过 (1023*9) 时 - 我在 recv 命令上冻结。 也许它的 FreeBSD 默认 UNIX 套接字限制或 C++ 默认套接字设置?谁知道?
我做了一些额外的测试,我 100% 确定它在执行 ::recv 命令时的最后第 9 次迭代中“冻结”,当尝试读取 >= (1023*9) 字节长的消息时。(第 8 次迭代进展顺利。)
我在做什么: 这个想法是从一个套接字读取一个 do/while 循环
::recv (current_socket, buf, 1024, 0);
并检查buf
特殊符号。如果没有找到:
- 将缓冲区的内容合并到
stringxxx += buf;
- bzero 温度缓冲区
- 继续 ::recv 循环
如何解决请求在 while 循环中花费太长时间的问题?
有没有更好的方法来清除缓冲区?目前,它是:
char buf [1025];
bzero(buf, 1025);
但我知道 bzero 在新的 c++ 标准中已被弃用。
编辑: * “为什么需要清理缓冲区*
我在这个问题的评论中看到了问题。如果在读取缓冲区的下一次(最后一次)迭代中没有清理缓冲区,它将包含消息第一部分的“尾部”。
例子:
// message at the socket is "AAAAAACDE"
char buf [6];
::recv (current_socket, buf, 6, 0); // read 6 symbols, buf = "AAAAAA"
// no cleanup, read the last part of the message with recv
::recv (current_socket, buf, 6, 0);
// read 6 symbols, but buffer contain only 3 not readed before symbols, therefore
// buf now contain "CDEAAA" (not correct, we waiting for CDE only)