2012-03-16 170 views
0

這是我在寫一個基本的代理服務器的一部分。此代碼讀取服務器對HTTP請求的響應,然後將其寫回客戶端(瀏覽器)。當我用firefox測試它時,它會加載我的大部分主頁,但無法加載圖像。然後它會凍結,並且在初始頁面之後我無法加載任何其他內容。可能是因爲我沒有正確關閉連接,以便它可以向我的代理髮出另一個請求。我不知道該怎麼做。這裏接收服務器響應並將其發送到瀏覽器?

終端輸出停止在「完成」。它不打印「重新開始」,但不打印「退出時循環」。所以我無法弄清楚它在哪裏停滯不前,或者如何正確地結束連接,以便在加載Google之後,我實際上可以啓動Google搜索或加載Gmail或其他任何內容。

while((n = read(sock, buffer2, 1024)) >= 1) 
    { 
     printf("Started over: %i :(\n\n", n); 

     buffer2[n] = '\0'; 
     printf("Rcvd message from server: \n\n----\n\n%s\n\n----\n\n", buffer2); 
     n = write(newsock, buffer2, strlen(buffer2)); 

     printf("\n\nFinished.\n\n"); 
    } 

    close(sock); 
    printf("\n\nExited while loop.\n\n"); 
+0

這是你發佈的另一個問題的副本:http://stackoverflow.com/questions/9728653/handling-a-server-response-and-sending-it-the-browser;也許你應該刪除這一個。 – 2012-03-16 01:45:11

+0

是啊,我知道,但我是絕望的答案,我並沒有得到one--我知道這是一件壞事。我通常不會這樣做。我會刪除其他。 – Aerovistae 2012-03-16 02:09:26

回答

1

幾點建議:

  • 檢查從read返回代碼兩者都爲零和負值。
    n > 0  裝置n個字節的數據是可用的
    n == 0意味着對等已經關閉了連接
    n < 0  表示錯誤。

  • 如果你的插槽是非阻塞的,不退出對一個EAGAINEWOULDBLOCK錯誤的循環,這意味着沒有數據可用,但連接仍然是開放的(所以更多的數據可能是未來)。

  • 檢查從write也返回代碼。

  • 從插座返回的數據可以是二進制(這就是爲什麼read返回它接收到的字節數)。如果數據恰好包含一個零字節,則printf將截斷其輸出在這一點上,和strlen將導致write同樣的行爲。一定要打印/寫入所有n字節。

  • 在調試器中運行代碼,所以你可以真的看看發生了什麼。

相關問題