我有一台服务器,它发送分块的传输编码数据。我使用InternetReadFile读取数据,但InternetReadFile在读取第一个块后失败,并显示12004。我用提琴手(Wireshark)拦截接收到的数据。 Wireshark显示第二个块,但InternetReadFile API失败。
样例代码:
CString totalbuffer ;
While ( 1 )
{
char recv [ 10 ] = '\0' ;
DWORD dwBytesRead = 0 ;
if ( InternetReadFile ( httpSocket.hReq , recv, 10 , &dwBytesRead ) )
{
recv[ dwBytesRead] = '\0' ;
totalbuffer += recv ;
printf ( " received buffer : %s" , recv ) ;
return 1 ;
}
else
{
printf ( " InternetReadFile failed with : %d" , GetLastError ( ) ) ;
return 0 ;
}
};
WireShark显示:
HTTP / 1.1 200 OK
传输编码:分块
日期:2014年9月18日,星期四14:16:16 GMT
伺服器:CHND
3
好\ n
3
CMD
客户端仅读取前3个字节的块。当我尝试读取下一个3个字节的块“CMD”时,它不起作用。
请帮助客户端进行哪些必要的更改?还是服务器端需要额外处理?
最佳答案
我遇到了类似的问题,您需要使用InternetQueryDataAvailable()“查询”连接以获取任何其他信息:
while(TRUE)
{
res = InternetQueryDataAvailable(hr, &len, 0, 0);
if (!res || len == 0) break;
res = InternetReadFile(hr, recv, len, &dwbread);
if(!res || (res && dwbread == 0)) break;
totalbuffer += recv ;
...
}
使用它,它将查看是否有更多来自此HTTP请求的数据,并且这似乎要处理分块编码,因为字节数(“块”长度)不会显示在recv缓冲区中,因此我们不能以原始形式使用它。
注意:我的程序是C语言,而不是C++语言,但是您会逐渐了解。
关于c++ - InternetReadFile对于分块响应失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25929735/