Winsocket resv缓冲区错误
Winsocket resv buffer mistake
用Visual C理解winsocket的工作++这是我的代码:
while (true) {
char l[1];
recv(tsock.sock, l, 1, 0);
std::cout << l << std::endl;
if (!l)
{
return;
}
}
但当我尝试获取google.com:80http获取查询:时,我得到了什么
Connected
Sending request to host
H╠╠╠╠╠╠╠╠
T╠╠╠╠╠╠╠╠☺
T╠╠╠╠╠╠╠╠☻
P╠╠╠╠╠╠╠╠♥
/ ╠╠╠╠╠╠╠╠♦
1╠╠╠╠╠╠╠╠♣
.╠╠╠╠╠╠╠╠♠
0╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠
3╠╠╠╠╠╠╠╠
0╠╠╠╠╠╠╠╠
2╠╠╠╠╠╠╠╠♂
╠╠╠╠╠╠╠╠♀
F╠╠╠╠╠╠╠╠
o╠╠╠╠╠╠╠╠♫
u╠╠╠╠╠╠╠╠☼
n╠╠╠╠╠╠╠╠►
d╠╠╠╠╠╠╠╠◄
╠╠╠╠╠╠╠╠↕
╠╠╠╠╠╠╠╠‼
C╠╠╠╠╠╠╠╠¶
...
收到了很多垃圾。但当我将缓冲区的声明从1个单元格更改为2个或更多时,一切似乎都很好。代码
while (true) {
char l[2];
memset(&l, 0, sizeof(l));
recv(tsock.sock, l, 1, 0);
std::cout << l << std::endl;
if (!l)
{
return;
}
}
结果:
ConnectedSending request to hostHTTP / 1.0 302 Found
Cache - Control: private
Content - Type : text / html; charset = UTF - 8
Location: http ://www.google.ru/?gfe_rd=cr&ei=r_RPU4yzJ8GdwAOWjoDoAQ
Content - Length : 258
Date : Thu, 17 Apr 2014 15 : 35 : 11 GMT
Server : GFE / 2.0
Alternate - Protocol : 80 : quic
<HTML><HEAD><meta http - equiv = "content-type" content = "text/html;charset=utf-8">
<TITLE>302 Moved< / TITLE>< / HEAD><BODY>
<H1>302 Moved< / H1>
The document has moved
<A HREF = "http://www.google.ru/?gfe_rd=cr&ei=r_RPU4yzJ8GdwAOWjoDoAQ">here< / A>
.
< / BODY>< / HTML>
这是怎么回事?
这里的主要问题是使用一个字符数组(即使它只是一个字符的数组),输出操作符将其解释为字符串。正如您所知,所有字符串都需要以特殊字符' '
结尾,它可以位于您读取的字符之后的内存中的任何位置。
相反,您应该使用单个char
变量,并在接收时使用操作员的地址:
char l;
recv(tsock.sock, &l, 1, 0);
或者,您可以使用一个更大的数组,并使用recv
的返回值来知道将字符串终止符放在哪里:
char l[1025]; // 1024 +1 for terminator
int rsz = recv(tsock.sock, l, sizeof(l) - 1, 0); // -1 for terminator
if (rsz > 0)
{
l[rsz] = ' '; // Terminate string
std::cout << l << std::flush;
}
else
{
// Handle closed connection, or errors
}
实际上,我推荐第二种选择。然后,您不仅可以检查错误和关闭的连接,而且更有效。
相关文章:
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 使用 strcat 获取缓冲区溢出错误
- 将缓冲区复制到剪贴板 [换行错误]
- openCL-创建子缓冲区返回错误代码13
- 与Qt交叉编译到Raspberry Pi 3B+通讯录(协议缓冲区)-错误符号查找错误
- 应该如何读取堆缓冲区溢出错误消息?
- 为什么我遇到缓冲区错误?
- 错误:使用未声明的标识符"缓冲区"C++
- 导致堆缓冲区错误的动态分配数组的析构函数
- OpenGL 顶点缓冲区类重定义和模板方法错误
- 带有模板的循环缓冲区在Keil MDK5上是模棱两可的错误?
- 协议缓冲区错误版本
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 可能的 ComputeCPP SYCL 错误读取嵌套缓冲区
- 为什么 LeetCode 给出错误:地址清理器:堆缓冲区溢出
- 为什么错误 C6386 缓冲区溢出与 strsafe.h 字符串 Cch 函数
- C++缓冲区太小错误
- coreValidation-drawState-Invalidimagelayout错误上的命令缓冲区错误
- Cython缓冲区协议示例错误