我在项目中非常使用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
的原始源代码