Сбой InternetReadFile для фрагментированного ответа

У меня есть сервер, который отправляет данные кодирования передачи по частям. Я использую 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», он не работает.

Пожалуйста, помогите с какими необходимыми изменениями должен сделать клиентский конец? или сервер должен обрабатывать что-то дополнительное?

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-запроса, и это, кажется, заботится о чанкованном кодировании, так как количество байтов (длина «чанка») не будет отображаться в буфере recv, поэтому мы не можем использовать это в необработанном виде.

Примечание: моя программа на C, а не C ++, но вы получите дрейф.

1

Другие решения


По вопросам рекламы [email protected]