2014-09-19 110 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

傳輸編碼:分塊

日期:星期四,2014年9月18日14時16分: 16 GMT

服務器:CHND

確定\ n

CMD

客戶端僅讀取前3個字節的塊。當我嘗試讀取下一個3字節塊「CMD」時,它不起作用。

請問客戶端應該做什麼必要的修改?或者服務器端需要處理額外的東西?

+0

相關:你知道你正在閱讀,如果完全填充該緩衝區前10個字節,行後立即將調用*不確定的行爲*通過一個元素超出你的數組的大小。 (即''dwBytesRead == 10'對於recv [dwBytesRead] ='\ 0'是不好的;'當數組只有10個元素寬時(因此只能從0..9索引)。 – WhozCraig 2014-09-19 08:46:36

回答

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++,但是你會得到漂移。