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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

HTTP

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

サーバ

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

Q&A

解決済

2回答

2474閲覧

HTTPリクエストで画像が表示できません

Subaru

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

HTTP

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

サーバ

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

0グッド

0クリップ

投稿2015/05/15 03:12

WEBサーバ作成しています。
index.htmlは表示できるのですがJPEGやfaviconが読めなくてずっとアクセス状態になってしまいます。
どうしたらいいのでしょうか?

lang

1#include <stdio.h> 2#include <stdlib.h> 3#include <sys/socket.h> 4#include <sys/fcntl.h> 5#include <arpa/inet.h> 6#include <string.h> 7#include <sys/wait.h> 8#include <unistd.h> 9 10#define MAXPENDING 5 11 12 13void httpd(int sockfd); 14 15 16void DieWithError(char *errorMessage){ 17 perror(errorMessage); 18 exit(1); 19} 20 21int CreateTCPServerSocket(unsigned short port){ 22 int sock; 23 struct sockaddr_in echoServAddr; 24 25 if((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 26 DieWithError("socket() failed"); 27 28 memset(&echoServAddr, 0, sizeof(echoServAddr)); 29 echoServAddr.sin_family = AF_INET; 30 echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); 31 echoServAddr.sin_port = htons(port); 32 33 if(bind(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) 34 DieWithError("bind() failed"); 35 36 if(listen(sock, MAXPENDING) < 0) 37 DieWithError("listen() failed"); 38 39 return sock; 40} 41 42 43int AcceptTCPConnection(int servSock){ 44 int clntSock; 45 struct sockaddr_in echoClntAddr; 46 unsigned int clntLen; 47 48 clntLen = sizeof(echoClntAddr); 49 50 if((clntSock = accept(servSock, (struct sockaddr *) &echoClntAddr, &clntLen)) < 0) 51 DieWithError("accept() failed"); 52 53 printf("Handling client %s\n", inet_ntoa(echoClntAddr.sin_addr)); 54 55 return clntSock; 56} 57 58int send_msg(int fd, char *msg) { 59 int len; 60 len = strlen(msg); 61 62 if ( write(fd, msg, len) != len ){ 63 fprintf(stderr, "error: writing."); 64 } 65 return len; 66} 67 68 69 70/*==========================*/ 71int main(int argc,char *argv[]){ 72 73 int servSock; 74 int clntSock; 75 unsigned short ServPort; 76 pid_t pid; 77 unsigned int childProcCount = 0; 78 int pipefd[2]; 79 int status; 80 81 82 int len; 83 int read_fd; 84 char buf[2048]; 85 86 char meth_name[16]; 87 char uri_addr[256]; 88 char http_ver[64]; 89 90 char *uri; 91 char *value; 92 char *uri_file; 93 94 char *ret; 95 96 97 if(argc != 2){ 98 fprintf(stderr, "Usage: %s <server port>\n",argv[0]); 99 exit(1); 100 } 101 102 ServPort = atoi(argv[1]); 103 servSock = CreateTCPServerSocket(ServPort); 104 105 106 107 for(;;){ 108 clntSock = AcceptTCPConnection(servSock); 109 110 sigignore(SIGCHLD); 111 112 int fd[2]; 113 pipe(fd); 114 115 pid = fork(); 116 117 if(pid == 0){ 118 //子プロセス 119 if (read(clntSock, buf, 2048) <= 0 ) { 120 fprintf(stderr, "error: reading a request.\n"); 121 exit(0); 122 } 123 else { 124 sscanf(buf, "%s %s %s", meth_name, uri_addr, http_ver); 125 printf("%s %s %s\n", meth_name, uri_addr, http_ver); 126 127 //get 128 if (strcmp(meth_name, "GET") != 0) { 129 send_msg(clntSock, "501 Not Implemented"); 130 } 131 uri_file = uri_addr+1; 132 read_fd = open(uri_file, O_RDONLY, 0666); 133 if (read_fd == -1) { 134 send_msg(clntSock, "404 Not Found"); 135 } 136 else { 137 send_msg(clntSock, "HTTP/1.1 200 OK\r\n"); 138 send_msg(clntSock, "text/html\r\n"); 139 send_msg(clntSock, "\r\n"); 140 141 while((len = read(read_fd, buf, 1024)) > 0) { 142 if (write(clntSock, buf, len) != len) { 143 fprintf(stderr, "error: writing a response.\n"); 144 break; 145 } 146 } 147 close(read_fd); 148 } 149 } 150 } 151 else if(pid == -1){ 152 DieWithError("fork():failed"); 153 exit(-1); 154 } 155 156 157 158 } 159} 160 161 162

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

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

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

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

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

guest

回答2

0

ベストアンサー

HTTP/1.1 なら Keep-Alive がデフォルトで有効です。なのでサーバはレスポンスヘッダで Content-Length を返す必要があります。そうしないといつまでたってもレスポンスが終わったことにならないです。

あるいは下記の点に留意して Keep-Alive を無効にするといいでしょう。

  1. accept -> fork 後に親プロセスでクライアントのソケットを閉じる
  2. 子プロセスは Connection: close レスポンスヘッダを返す
  3. 子プロセスはレスポンスを返したら exit する

1 と 3 はレスポンスの完了後にクライアントとの接続を切るために必要です。

また、下記の部分はレスポンスヘッダの形式になっていません。ブラウザは勝手に無視すると思いますが、無い方がマシなのでコメントアウトするといいでしょう。

send_msg(clntSock, "text/html\r\n");

投稿2015/05/15 04:27

編集2015/05/15 04:51
ngyuki

総合スコア4514

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

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

0

send_msg(clntSock, "text/html\r\n");で、Content-typeが固定になってしまっているので、text/htmlしか送れなくなっています。適切に設定しましょう。

投稿2015/05/15 04:14

maisumakun

総合スコア145123

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

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

Subaru

2015/05/15 04:21

具体的にはどのように直せばいいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問