【发布时间】:2011-11-06 04:05:56
【问题描述】:
我在使用 winsock 读取一些分块的 HTTP 响应数据时遇到问题。 我发送请求很好并得到以下回复:
HTTP/1.1 200 OK
Server: LMAX/1.0
Content-Type: text/xml; charset=utf-8
Transfer-Encoding: chunked
Date: Mon, 29 Aug 2011 16:22:19 GMT
使用winsock recv。然而,此时它只是挂起。我让侦听器在无限循环中运行,但没有收到任何内容。
我认为这是一个 C++ 问题,但也可能与我通过 stunnel 推送连接以将其包裹在 HTTPS 中的事实有关。我有一个使用 C# 中的一些库的测试应用程序,它可以通过 stunnel 完美运行。我很困惑为什么我的循环在初始接收后没有接收到 C++ 分块数据。
这是有问题的循环...在上面的分块 ok 响应之后调用...
while(true)
{
recvBuf= (char*)calloc(DEFAULT_BUFLEN, sizeof(char));
iRes = recv(ConnectSocket, recvBuf, DEFAULT_BUFLEN, 0);
cout << WSAGetLastError() << endl;
cout << "Recv: " << recvBuf << endl;
if (iRes==SOCKET_ERROR)
{
cout << recvBuf << endl;
err = WSAGetLastError();
wprintf(L"WSARecv failed with error: %d\n", err);
break;
}
}
有什么想法吗?
【问题讨论】:
-
我建议您将代码更改为不在循环中分配,否则您会泄漏内存,一次一个 DEFAULT_BUFLEN。另外,循环的停止条件是什么?您是否有可能在到达
recv之前消耗了数据? -
是的,我知道它正在泄漏内存,但我现在对此并不太在意。我可以轻松地将其切换到 memset。每次接收后我都会进行打印,这表明数据永远不会到达。
-
如果您在此位之前发布代码可能会有所帮助,以查看您是否不小心使用了数据。另请注意,如果
recv返回错误,则永远不会修改recvBuf,因此打印毫无意义。 -
cout
标签: c++ winsock http-get chunked stunnel