質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

解決済

1回答

1927閲覧

HTTPヘッダ出力とソースコードプログラムの対応について

asm9922

総合スコア12

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

0グッド

0クリップ

投稿2018/12/04 01:34

編集2018/12/04 01:57

Cで簡単なサーバプログラムを作り、稼働させ、ターミナル上にHTTPリクエストヘッダ等を出力できたのですが、自分の作ったプログラムのどの部分でそのメーセージが生成されているのかが分かりません。
大まかな生成場所でいいので、教えていただけると幸いです。
socket() listen() bind() accept()等の関数をしようしています。

表示
GET / HTTP/1.1
Host: 127.0.0.1
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.1 Safari/605.1.15
Accept-Language: ja-jp
Accept-Encoding: gzip, deflate
Connection: keep-alive

HTTP/1.1 200 OK
Content-Length: 27
Content-Type: text/html
Date: Thu Jan 1 00:00:00 JST 2012

C言語

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4#include <unistd.h> 5#include <sys/types.h> 6#include <sys/socket.h> 7#include <netinet/in.h> 8#include <arpa/inet.h> 9 10#define SERVER_PORT (80) 11 12 13int 14main(void) { 15 int listen_sockfd; 16 int accept_sockfd; 17 socklen_t sin_size; 18 struct sockaddr_in client; 19 struct sockaddr_in serv; 20 int retc; // return code from functions 21 FILE *fp; 22 23 int numccr = 0; /* counter for contiguraous '\n' */ 24 char inchar; /* received (keyboard inputted) char */ 25 26/* init */ 27 memset(&client, 0, sizeof(struct sockaddr_in)); 28 sin_size = sizeof(struct sockaddr_in); 29 30/* make TCP socket */ 31 listen_sockfd = socket(PF_INET, SOCK_STREAM, 0); 32 if (listen_sockfd < 0 ) { 33 perror("webserver (socket)"); 34 exit(11); 35 } 36 37/* bind() */ 38 memset(&serv, 0, sizeof(struct sockaddr_in)); 39 serv.sin_family = PF_INET; // IPv4 40 serv.sin_addr.s_addr = htonl(INADDR_ANY); // IP address 41 serv.sin_port = htons(SERVER_PORT); // port # 42 retc = bind(listen_sockfd, (struct sockaddr *)&serv, 43 sizeof(struct sockaddr_in)); 44 if (retc < 0 ) { 45 perror("webserver (bind)"); 46 47 close(listen_sockfd); 48 49 exit(12); 50 } 51 52 53/* listen() */ 54 retc = listen(listen_sockfd, SOMAXCONN); 55 if (retc != 0) { 56 perror("webserver (listen)"); 57 close(listen_sockfd); 58 exit(13); 59 } 60 61/* accept() */ 62 accept_sockfd = accept(listen_sockfd, 63 (struct sockaddr *)&client, &sin_size); 64 if (accept_sockfd < 0) { 65 perror("webserver (accept)"); 66 67 exit(14); 68 } 69 close(listen_sockfd); 70 71/* use FILE * pointer instead of file descriptor */ 72 if ((fp = fdopen(accept_sockfd, "r+")) == NULL) { 73 perror("webserver (fdopen)"); 74 exit(15); 75 } 76 77/*** receive request ***/ 78 /* 79 * (通信回線:TCP port 80)(fp)から1文字ずつ入力⇨モニタ出力 80 * '\n'が2個連続したら次へ 81 */ 82 while(1){ 83 fscanf(fp,"%c", &inchar); 84 85 if(inchar == '\r'){ 86 continue; 87 } 88 fprintf(stderr,"%c", inchar); 89 90 if(inchar == '\n'){ 91 ++numccr; 92 if(numccr == 2){ 93 break; 94 } 95 } 96 else{ 97 numccr = 0; 98 } 99 } 100 101 /*** send header, then body ***/ 102 /* 103 * TCP port 80(fp)に以下の6行(サーバ➡クライアントに送られるはずの 104 * HTTPストリーム)をただ表示する 105 */ 106 107 fprintf(fp, 108 "HTTP/1.1 200 OK\n" 109 "Content-Length: 27\n" 110 "Content-Type: text/html\n" 111 "Date: Thu Jan 1 00:00:00 JST 2012\n" 112 "\n" 113 "<p>My num is 201704198.</p>" 114 ); 115 116 117 /*** monitor set data ***/ 118 /* 119 * モニタ出力: 標準エラー出力に上と同じものを表示する 120 */ 121 fprintf(stderr, 122 "HTTP/1.1 200 OK\n" 123 "Content-Length: 27\n" 124 "Content-Type: text/html\n" 125 "Date: Thu Jan 1 00:00:00 JST 2012\n" 126 "\n" 127 "<p>My num is 201704198.</p>" 128 ); 129 130 /* cleanup */ 131 fclose(fp); 132 close(listen_sockfd); 133 close(accept_sockfd); 134 fprintf(stderr, "server: exit normally.\n"); 135 exit(0); 136} 137 138``

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2018/12/04 01:45

プログラム自体がないので、なんとも言えません。
otn

2018/12/04 01:58

書いた本人が分からないというのは、どういうことでしょうか?
asm9922

2018/12/04 02:04

雛形があり、個人的にマイナーチェンジを行なっただけなので理解は深くないです。
kunai

2018/12/04 02:07

自分で書いてないでしょ、これ。というかCでプログラム書けないでしょ。
asm9922

2018/12/04 02:11

最近勉強を始めたばかりで、基本的な事項しかよくわかっておりません。
otn

2018/12/04 02:14

プログラムは読もうと試みましたか?C言語は知っていますか?
asm9922

2018/12/04 02:32

Cは読めます。
otn

2018/12/04 03:06

じゃあ、読みましょう。
guest

回答1

0

ベストアンサー

自分の作ったプログラムのどの部分でそのメーセージが生成されているのかが分かりません。

途中にある「ただ表示する」の部分で、決めうちにしています。

投稿2018/12/04 02:02

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm9922

2018/12/04 02:06

/* monitor set data */ 部分でしょうか?
maisumakun

2018/12/04 02:13

send header, then body の箇所です(コメントの日本語を読んでも判別がつかないのでしょうか)。
asm9922

2018/12/04 02:32

fpではなくstderrに出力指定している、monitor set data 部分だと私は考えたのですが。
maisumakun

2018/12/04 02:41

あくまでサーバの本分は「相手に応答を返す」ことなので、「メーセージ」は相手に返す方だと判断していました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問