2016-09-20 16 views
2

これは、私が学んでいるサーバー:http://blog.abhijeetr.com/2010/04/very-simple-http-server-writen-in-c.htmlです。C HTTPサーバーが自分のサーバーに要求を送信しますか?

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

これは学校の割り当てですが、私たちはこの課題のためのコードをコピーすることができますが、著者の出典が必要です。要点は、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 
+1

*リクエスト*をサーバーから送信する理由は何ですか?クライアントは要求を送信し、応答で応答します。 –

+0

リクエストを作成する場合は、ローカルブラウザでリクエストしますか?あるいは 'curl'のようなコマンドラインツールを使用しますか? –

+0

私は自分が何をやっているのか分からないと言っているように、私はサーバーについての最初のことは知らない。クライアントは要求を送信し、私は応答します。このサーバーには既に返信があります。curlコマンドの外観はどうですか? http://stackoverflow.com/questions/27422918/send-http-get-request-using-curl-in-cは1つを示します。しかし、再び私はこれがURLを持っているかどうかわからないし、もしそれが何かをするならば – TheMangaStand

答えて

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 /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 

:接続が行われると、ブラウザは次のようになります標準のGETリクエストで「会話」を開始しますほとんどのウェブサイトがそれなしでは動作しないため、「ホスト」ヘッダーを含めることができます(これにより、複数のWebサイトで単一のIPアドレスを共有できます)。その場合、サーバーはここでホスト名を指定せずに訪問しようとしているWebサイトを知ることができません。

そのサーバー上のindex.htmをフェッチするための最低限のGETリクエストは、単に次のようになります要求の端部は、二重CRLFシーケンス(ASCIIコード13及び10)によって終了されること

GET /index.htm HTTP/1.1 

NOTE最も最近のヘッダー行の1つ、要求ヘッダーの終わりを示すもう1つ。ダブル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を指定することができます。例えば:

-iオプションではなく、この場合のTest.htmの内容であるだけエンティティよりも(HTTPレスポンスヘッダを含む)全体のウェブサーバの応答を表示するようにカールさせます。実行中のWebサーバーが同じマシン上にあるかネットワーク上の他の場所にあるかにかかわらず、上記のURLを調整するだけで済みます。

関連する問題