C ++读取Socket主体,解析时发生意外行为

时间:2019-06-14 08:33:34

标签: c++ sockets webserver

我在项目中非常使用simple C++ webserver,但是在读取套接字数据时遇到了一些问题。在套接字类的ReceiveBytes函数中,有一个循环读取与HTTP请求正文所包含的字节一样多的字节(默认缓冲区大小为1024)。这段代码在调试模式下有效,但在发布模式下无效:

std::string Socket::ReceiveBytes() {
  std::string ret = "";
  char buf[1024] = { NULL };

  std::string t = "";

  while (1) {
    u_long bufferlen = 0;
    if (ioctlsocket(s_, FIONREAD, &bufferlen) != 0)
        break;

    if (bufferlen == 0)
        break;

    if (bufferlen > 1024) bufferlen = 1024;

    int rv = recv(s_, buf, bufferlen, 0);
    if (rv <= 0) break;

    t = "";

    t.assign(buf, rv);

    ret += t;
  }

  return ret;
}

在释放模式下,循环并不总是从包中读取所有内容,而是在读取过程的中间停下来。

我显然想到了读取缓冲区并将其分配给返回字符串的错误,但是什么也没找到。

现在,如果我每次循环运行时都输出缓冲区(std::cout << t << std::endl之后的ret += t;可以在释放模式下正常工作。

我初始化了所有变量,但是没有初始化它是相同的结果。我也尝试将缓冲区直接附加到结果字符串(ret)上,同样没有成功。

一定有我想念的东西,也许有人可以给我一点提示我做错了什么。

编辑,您可以找到我正在谈论的文件here

的原始源代码

0 个答案:

没有答案