2

これは私が学んでいるサーバーです: http://blog.abhijeetr.com/2010/04/very-simple-http-server-writen-in-c.html

get requests サーバーなどを完全に理解していません。get リクエストを送信するにはどうすればよいですか? これを行う方法がわからないと思う理由は、すべてのチュートリアルが、現在のディレクトリから、または少なくとも私が理解していることから、Web サイトから要求を取得することを示しているためです。

これは学校の課題です。この課題のコードをコピーすることは許可されていますが、作成者を入手する必要があります。ポイントは、Web サーバーがどのように機能するかを学ぶことであり、Get 要求が何をするのか、この特定のサーバーに実装する方法を理解していないため、その効果を調べることができます。

ありがとうございます。以下は、私がヒットしたい特定のコードです。さまざまな get リクエストをテストして、取得できる応答またはエラーを確認したいと考えています。

if ( (fd=open(path, O_RDONLY))!=-1 )
{
    send(clients[n], "HTTP/1.0 200 OK\n\n", 17, 0);
    while ( (bytes_read=read(fd, data_to_send, BYTES))>0 )
        write (clients[n], data_to_send, bytes_read);
}
else    write(clients[n], "HTTP/1.0 404 Not Found\n", 23); //FILE NOT FOUND
4

1 に答える 1

0

HTTP 1.1 RFC #GETを見て、GET リクエストとは何かを理解してください。ブラウザーを使用して Web サイトにアクセスすると (すべての Web サイトは何らかの HTTP サーバー上で実行されます)、ブラウザーはクライアントとして機能し、Web サイトはサーバーとして機能します。クライアントがリクエストを開始し、サーバーがそのリクエストに応答します。

要求の主なタイプ (ユーザーが表示しようとしている URL に応答してブラウザーによって生成される) は、GET 要求です。

たとえば、ユーザーが URL http://www.example.com/index.htmにアクセスしたい場合、ブラウザーはサーバー www.example.com の TCP ポート 80 (デフォルト) に接続します。接続が確立されると、ブラウザは次のような標準の GET リクエストで「会話」を開始します。

GET /index.htm HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; sv-SE; rv:1.8.1.12) Gecko/20080207 Ubuntu/7.10 (gutsy) Firefox/2.0.0.12
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
Connection: keep-alive

最初の行 (リクエスト行) の後のヘッダーはオプションですが、ほとんどの Web サイトは "Host" ヘッダーがないと機能しないため、ブラウザーは常に "Host" ヘッダーを含めたいと考えます (これにより、複数の Web サイトが単一の IP アドレスを共有できるようになります)。その場合、サーバーは、ここでホスト名を指定しないと、アクセスしようとしている Web サイトを認識できません。

そのサーバーで index.htm を取得するための最小限の GET 要求は、単純に次のようになります。

GET /index.htm HTTP/1.1

要求の終わりは、2 つの CRLF シーケンス (ASCII コード 13 および 10) によって終了することに注意してください。二重 CRLF シーケンスがサーバーによって受信されると、サーバーはそれに応じてステータス行とコードで応答します (ドキュメントは見つかりましたか?)。ドキュメントが見つかった場合、通常は HTTP ステータス コード 200、応答ヘッダー (これらは要求ヘッダーと同じ形式です)、二重の CRLF シーケンス、要求されたファイルの本文が続く応答で返されます。HTTP 標準では、これを「エンティティ」と呼んでいます。この場合、返されるエンティティは index.htm の内容になります。上記の例を使用すると、サーバーは次のように応答する可能性があります。

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 66
Last-Modified: Wed, 14 Sep 2016 13:05:21 GMT

<html>
<body>
    Welcome to my example page
</body>
</html>

これは簡単に言えば HTTP GET/応答会話の簡単な例ですが、要求ヘッダーと応答ヘッダーによってはさらに複雑になる可能性があると推測できます。

実行中のサーバーに GET リクエストを手動で送信する方法についての質問に答えるために、Linux マシンで「curl -i」を使用するのが好きです。Curl はクライアント/ブラウザとして機能し、GET (ダウンロード) する URL を指定できます。例えば:

curl -i http://localhost/test.htm

-i オプションを使用すると、curl は、この場合は test.htm のコンテンツであるエンティティだけでなく、Web サーバーの応答全体 (HTTP 応答ヘッダーを含む) を表示します。上記の URL を、実行中の Web サーバーの URL と一致するように調整する必要があります。

于 2016-09-20T19:45:13.387 に答える