2014-09-19 10 views
0

У меня есть сервер, который отправляет данные с кодировкой передаваемых данных. Я использую InternetReadFile для чтения данных, но InternetReadFile не работает с 12004 после прочтения первого фрагмента. Я использовал скрипач (Wireshark), чтобы перехватить полученные данные. Wireshark отображает второй фрагмент, но InternetReadFile 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 OK

Transfer-Encoding: фрагментированное

Дата: Ср, 18 Сен 2014 14:16: 16 GMT

Сервер: CHND

Ok \ п

CMD

клиент читает только первые 3 байта кусок. Когда я пытаюсь прочитать следующий 3-байтовый фрагмент «CMD», он не работает.

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

+0

Связанные: Вы знаете, что первые 10 байтов, которые вы читаете, если вы заполняете этот буфер, строка сразу же вызывается * неопределенным поведением *, превысив размер вашего массива на один элемент. (т. е. 'dwBytesRead == 10' является плохим для' recv [dwBytesRead] = '\ 0'; ', когда массив имеет ширину всего 10 элементов (и, следовательно, индексируется только от 0..9). – WhozCraig

ответ

0

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