繁体   English   中英

在不知道缓冲区大小的情况下从套接字读取

[英]Read from a socket without knowing the size of the buffer

我在所有消息的末尾添加了一个分隔符,所以我知道什么时候到达了消息的末尾。 一旦我的消息超过缓冲区的指定大小,并且我必须第二次从套接字读取,就会发生奇怪的事情。 例如,一个随机的 '\\n' 字符将随机出现在我的消息中的某个地方,只有当我不得不多次从同一个套接字读取时才会发生这种情况,因为消息大于缓冲区的大小。 下面的代码有什么缺陷吗?

我正在使用 Unix 套接字头文件。

std::string bufferStr;

// check to see if the delimiter is in the buffer string
while(bufferStr.find(DELIM)==std::string::npos)
        {
            valread = read(sock,buffer,1024);
            bufferStr+=std::string(buffer);
        }

这里有很多问题,但最重要的是你忽略了读取的字节数。

必须注意这一点,并在构造字符串时使用它:

std::string(buffer, valread);

如果您忽略这一点,那么您将传入假定为以 NUL 结尾的 C 字符串,但您只有原始数据,没有终止符,以及上次读取调用的剩余垃圾。

您还应该检查valread是否 > 0,因为这可能表示读取时出现错误。 将负值传递给构造函数会导致问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM