2012-03-15 209 views
1

我正在用C寫一個基本代理服務器的最後一個主要障礙。如何處理來自服務器的分塊響應?

我已經讓我的服務器成功接收來自瀏覽器的請求,然後成功地將它們發送到主機,無論它們在哪裏。我正在成功接收主持人的回覆!除此之外,當我嘗試通過服務器連接到Google時,出現以下情況:

Rcvd message from server: 

---- 

HTTP/1.1 200 OK 
Date: Thu, 15 Mar 2012 20:35:11 GMT 
Expires: -1 
Cache-Control: private, max-age=0 
Content-Type: text/html; charset=UTF-8 
Set-Cookie: PREF=ID=83a7c2e6675a9a9f:FF=0:TM=1331843711:LM=1331843711:S=7I7RIVV1B-HxhWJR; expires=Sat, 15-Mar-2014 20:35:11 GMT; path=/; domain=.google.com 
Set-Cookie: NID=57=KvqnXtYNkJZBryXL5zzhG5eH8Or2_PDWDqT_kU35PvOro_mAFiLiTSjPHOnWWxxm3R0vKYnzEeVkAPFKK366lZiNZGpjhO2-II5OeZQnWe09H-jZdePsrN-SnBdQ2ENT; expires=Fri, 14-Sep-2012 20:35:11 GMT; path=/; domain=.google.com; HttpOnly 
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info." 
Server: gws 
X-XSS-Protection: 1; mode=block 
X-Frame-Options: SAMEORIGIN 
Transfer-Encoding: chunked 

1000 
<!doctype html><html itemscope itemtype="http://schema.org/WebPage"><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"><meta name="description" content="Search the world&#39;s information, including webpages, images, videos and more. Goo 

您看到它是如何切斷的?由於「傳輸編碼:分塊」。現在如何讓服務器繼續向我發送其餘的塊?因爲在第一個之後,它停止。我是否需要在while循環中放置read(),並且只要有東西要閱讀,就說要繼續閱讀並轉發給客戶端?

編輯:

好的,這是我現在的代碼。這使服務器的響應(在名爲「sock」的套接字上)的一個初始讀取,將其寫入客戶端(「newsock」),然後進入while循環以繼續讀取更多服務器響應並將其發送到客戶端。我還沒有測試過這種形式的代碼。除了一些錯誤檢查差距之外,你還看到任何明顯的問題嗎?

/*WRITING SERVER RESPONSE TO CLIENT*/ 

    char buffer2[1024]; 

    n = read(sock, buffer2, 1024); 

    if (n < 1) 
    { 
    perror("read() failed"); 
    return EXIT_FAILURE; 
    } 

    else 
    { 
    buffer2[n] = '\0'; 
    printf("Rcvd message from server: \n\n----\n\n%s\n\n----\n\n", buffer2); 
    } 

    n = write(newsock, buffer2, strlen(buffer2)); 

    while((n = read(sock, buffer2, 1024)) >= 1) 
    { 
     buffer2[n] = '\0'; 
     printf("Rcvd message from server: \n\n----\n\n%s\n\n----\n\n", buffer2); 
     n = write(newsock, buffer2, strlen(buffer2)); 
    } 
+1

你能詳細說明你做了什麼(放置你的相關C代碼),你爲什麼說它會被切斷? – roni 2012-03-15 21:00:31

+0

我couuullld附加了一些代碼,除了我一直在編輯它,試圖自己解決它,我還沒有測試過,所以在這一刻我不知道它會做什麼。需要一些時間。而且我認爲如果您向右滾動,您會看到截止日期 - 顯然Google.com的代碼不止於此。它只停留在meta標籤的中間。還有更多未來。 – Aerovistae 2012-03-15 21:01:35

+0

@Aerovistae,你如何使用內容長度作爲迴應? – perreal 2012-03-15 21:07:24

回答

1

不能使用strlen得到您的緩衝區的大小,strlen的只爲得到一個字符串的大小,你可能讀一些二進制數據,因爲不僅可以通過文字去你的代理(圖片...)。嘗試使用read而返回的值,這是實際讀取的字節數。

以'\ n'結尾字符串變得毫無用處。

+0

但塊是文本和圖像的混合,他們不是?我應該永遠不會空終止,否則會導致文本部分的錯誤? – Aerovistae 2012-03-16 02:51:39

+1

你沒有任何理由來終結問題,就是你在推理,就好像它在琢磨哪一個不是原始數據。所以在你的數據中間你可能會得到一個等於0的字節。這就是你的strlen不工作的原因。不要認爲這是文本和圖像,而是數據。所以沒有理由終止 – Mualki 2012-03-16 03:03:32

+0

可以在char數組中保存原始數據嗎?我不知道還有什麼其他類型的變量。 – Aerovistae 2012-03-16 03:04:52