【问题标题】:Read from a socket without knowing the size of the buffer在不知道缓冲区大小的情况下从套接字读取
【发布时间】:2021-02-21 22:23:42
【问题描述】:

我在所有消息的末尾添加了一个分隔符,这样我就知道何时到达了消息的末尾。一旦我的消息超过缓冲区的指定大小,并且我必须第二次从套接字读取,就会发生奇怪的事情。例如,一个随机的 '\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);
        }

【问题讨论】:

  • buffer 的大小是多少?是1024吗?
  • @tadman 1024 字节
  • 有很多代码没有显示,这可能是问题的根源。进行一些调试以缩小问题所在。

标签: c++ sockets network-programming


【解决方案1】:

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

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

std::string(buffer, valread);

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

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

【讨论】:

    猜你喜欢
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多