2012-03-15 13 views
0

クラスについては、cで基本的なプロキシサーバーを作成しています。前に、それはこのように見えるようにをプロキシに入れて、ブラウザにリクエストをフォーマットしてからホストに送信してください。

GET http://www.cs.rpi.edu/index.html HTTP/1.1 
Host: www.cs.rpi.edu 
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate 
Proxy-Connection: keep-alive 
Cookie: __utma=138860844.163543584.1329315062.1329315062.1329315062.1;__utmz=138860844.1329315062.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided) 
Cache-Control: max-age=0 

やフォーマット、プラス同意したUser-Agentヘッダ:教授の例では

(javaのである)、彼は次のようになりますこれは、ブラウザの要求を取りますホストサーバにそれを送信:

GET /index.html HTTP/1.1 
Host: www.cs.rpi.edu 

私もこれをやったが、今私は2つの問題に実行すると、1つの質問:メッセージは大丈夫サーバー、BECに送信する

A. connect()とwrite()は私に何のエラーも与えませんが、サーバーの応答(おそらく間違ってHTMLを期待していますか?)にread()すると、プログラムはフリーズし、Ctrl + Cまで永遠に座ります。私の人生が原因を見つけることができません:

/* write a message out on the socket connection */ 
    int n = write(sock, clientrequest, strlen(clientrequest)); 

    if (n < strlen(clientrequest)) 
    { 
    perror("write() failed"); 
    return EXIT_FAILURE; 
    } 

    printf("Made it here.\n\n"); 

    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); 
    } 

    printf("But not here.\n\n"); 

私はwww.google.comのようなものに接続しています。 /index.htmlはないので、フォーマットされたリクエストでGETを実行する必要はありますか?

C.なぜ、リクエストはそのまま送信されるのではなく、この方法でフォーマットする必要がありますか?

答えて

1

A)変更されたクライアント要求文字列の最後に2つの改行があることは確かですか?そうでない場合、サーバーは依然として残りの要求を送信するのを待っています。

また、最初のwrite()呼び出しがすべてのデータを送信しなかった場合には、失敗を宣言する必要はありません。あなたはループに座って、あなたのバッファーを使い果たすまで書いておくべきです。実際のエラーがあった場合は-1が返され、緊急を宣言することができます。

B)「GET/HTTP/1.1」のように「/」を入力してください。サーバーは何をすべきかを知るでしょう。

C)この形式では、GETおよびHost:行のみの要求と同様にフォーマットされていますか?場合によっては、プロキシサーバーの機能はプライバシーです。ブラウザは、自身に関する多くの情報を開示します。このプロキシの例では、多くの行を削除しています。

+0

私が読書を終える前に、2つの改行はありません。私は今それを変更するつもりです。どうもありがとうございます。私はそれも知っていた。私はちょうど完全に忘れてしまった。 – Aerovistae

関連する問題