我有一个发送分块传输编码数据的服务器。我使用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确定
Transfer-Encoding:chunked
日期:星期四,2014年9月18日14:16:16 GMT
服务器:CHND
3
确定\ n
3
CMD
客户端只读取前3个字节的块。当我尝试读取下一个3字节块“CMD”时,它无法正常工作。
请帮助客户端进行必要的更改吗?或者服务器端是否需要处理额外的事情?
答案 0 :(得分:1)
我有类似的问题,你需要"查询"使用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请求的更多数据,并且这似乎照顾了分块编码,因为字节数(" chunk" length )不会出现在recv缓冲区中,因此我们无法以原始形式使用它。
注意:我的程序是用C语言编写的,而不是C ++,但是你会得到漂移。