2012-03-16 11 views
0

これは私が書いている基本的なプロキシサーバーの一部です。このコードは、HTTPリクエストに対するサーバレスポンスを読み取り、それをクライアント(ブラウザ)に返します。私がfirefoxでテストすると、私のホームページのほとんどが読み込まれますが、イメージを読み込むことはできません。その後、フリーズし、最初のページの後には何もロードできません。おそらく、私は接続を適切に閉じずに、私のプロキシに別の要求をすることができないでしょう。私はそれをどうやって行うのか分からない。サーバーレスポンスを受信して​​ブラウザに送信しますか?

ここでの端末出力は「終了」で停止します。 "Started with"は印刷されませんが、 "Exited while loop"は印刷されません。私はどこに詰まっているのか、または接続を正しく終了する方法を理解できないので、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。おそらくあなたはこれを削除する必要があります。 –

+0

ええ、私は知っていますが、私は答えが切望されていました。私はそれを得ていませんでした - それは悪いことです。私は通常それをやりません。私はもう一方を削除します。 – Aerovistae

答えて

1

ヒント:

  • ゼロと負の値の両方のためのreadからの戻りコードを確認してください。
    n > 0  データのnバイト
    n == 0利用可能であることを意味ピアが
    n < 0  がエラーを示す接続を閉じたことを意味します。

  • ソケットが非ブロックの場合は、EAGAINまたはEWOULDBLOCKというエラーでループを終了しないでください。つまり、データは使用できませんが、接続はまだ開いています(データがさらに送られる可能性があります)。

  • writeの戻りコードも確認してください。

  • ソケットから返されるデータはバイナリである可能性があります(readは受け取ったバイト数を返します)。データに0バイトが含まれている場合、printfはその時点で出力を切り捨て、strlenwriteが同様に動作するようにします。すべてnバイトを印刷してください。

  • デバッガでコードを実行すると、は実際には何が起こっているか見ることができます。

関連する問題