У меня есть сервер, который отправляет данные кодирования передачи по частям. Я использую InternetReadFile для чтения данных, но InternetReadFile не удается с 12004 после чтения первого блока. Я использовал Fiddler (Wireshark), чтобы перехватить полученные данные. Wireshark отображает второй блок, но API InternetReadFile не работает.
Образец кода :
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 ОК
Передача-кодировка: чанки
Дата: четверг, 18 сентября 2014 г., 14:16:16 GMT
Сервер: CHND
3
Ok \ п
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 ++, но вы получите дрейф.