[英]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.