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

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

新規登録して質問してみよう
ただいま回答率
85.48%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

HTTP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

669閲覧

アセンブリ言語(GAS)でHTTPサーバー

binary

総合スコア33

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

HTTP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2018/12/15 07:06

編集2018/12/16 20:56

C言語(GAS)を用いてwebサーバーを作ろうとしています。
一応webサーバーのようなものを作ることができたのですが、解決したい問題があり自分の力では解決できそうにも無かったので質問しました。

質問内容1

クライアントからの要求にたいしてサーバーが2回応答しているようなのですがこれはクライアントの仕様なのでしょうか?それともサーバーのプログラムを改善することで解決できる問題なのでしょうか?

serverプログラムの状態

Waiting for conaction!....
Finished conaction!

Waiting for conaction!....
Finished conaction!

Waiting for conaction!....

1回のクライアントからの要求にたいして2回conactionして、また接続待ち状態に鳴っている

質問内容2

2.firefoxのブラウザーでしかwebサイトに入ることができません。safariの場合ネットワークが切れたと表示されてサイトに入れません。どのようにすれば様々なブラウザーから閲覧できるようになるのでしょうか?原因は質問内容1なのでしょうか?

見にくい質問すみません。回答よろしくお願いします。

GAS

1//-2024(%rbp)~-2017(%rbp):socket記述子:8 2//-2008(%rbp)~-2001(%rbp):1:8 3//-2000(%rbp)~-1985(%rbp):ソケットの名前:16 4//-1984(%rbp)~-1981(%rbp):120,accept関数の格納領域の大きさ:4 5//-1980(%rbp)~-1949(%rbp):クライアントのソケットを格納する領域:32 6//-1948(%rbp)~-1945(%rbp):ファイル記述子:4 7//-1944(%rbp)~-1941(%rbp):文字列の長さ:4 8//-1940(%rbp)~-1937(%rbp):newsocket記述子:4 9//-1936(%rbp)~-21(%rbp):ファイルデータ格納:1916 10//-20(%rbp)~-13(%rbp):output自作関数のためのメモリーアドレス領域 11 12 13.bss 14.comm buffer,1024 15 16 17.data 18fname: .string "test.html" 19output1: .string "Waiting for conaction!....\n" 20output2: .string "\n\n\n%S\n\n\n" 21output3: .string "Finished conaction!\n\n\n" 22output4: .string "fire read ok!\n" 23 24err1: .string "file open error!\n" 25err2: .string "make socket error!\n" 26err3: .string "error setsockopt!\n" 27err4: .string "error bind!(ソケットに名前をつけれませんでした)\n" 28err5: .string "error listen!\n" 29err6: .string "error accept!\n" 30err7: .string "error read html-file!\n" 31err8: .string "error cliant conaction\n" 32err9: .string "error send data!\n" 33 34.text 35.globl main 36main: 37pushq %rbp 38movq %rsp, %rbp 39subq $2024, %rsp 40movq $fname, %rdi 41movq $0, %rsi 42call open 43movl %eax, -1948(%rbp) 44cmpq $0, %rax 45jne main1 46movq $err1, %rsi 47call perror 48leave 49ret 50 51 52 53main1: /*htmlファイルを読み込む*/ 54leaq -1936(%rbp), %rsi 55movq $1900, %rdx 56movq -1948(%rbp), %rdi 57call read 58movl %eax, -1944(%rbp) 59cmpq $0, %rax 60jne main2 61movq $err7, %rdi 62call perror 63leave 64ret 65 66 67 68main2: /*file read okと表示*/ 69movq $output4, %rdi 70call output 71 72 73 74main3: /*make socket*/ 75movq $0, %rdx 76movq $1, %rsi 77movq $2, %rdi 78call socket 79movq %rax, -2024(%rbp) 80cmpq $-1, -2024(%rbp) 81jne main4 82movq $err2, %rdi 83call perror 84leave 85ret 86 87 88 89main4: /*setsockop関数:ソケット名の重複利用に関する制限を緩めるもの*/ 90movq $1, -2008(%rbp) 91leaq -2008(%rbp), %rdx 92movq -2024(%rbp), %rdi 93movq %rdx, %rcx 94movq $2, %rdx 95movq $1, %rsi 96movq $4, %r8 97call setsockopt 98cmpq $-1, %rax 99jne main5 100movq $err3, %rdi 101call perror 102leave 103ret 104 105 106 107main5: /*ソケットの名前を作る*/ 108leaq -2000(%rbp), %rdi 109movq $16, %rdx 110movq $0, %rsi 111call memset /*-240(%rbp)〜-224(%rbp)の16バイトを0で埋める*/ 112 113movw $2, -2000(%rbp) /*ソケットの名前:::ファミリー部分*/ 114 115movq $12345, %rdi 116call htons /*ソケット通信で利用できる形に変更*/ 117movw %ax, -1998(%rbp) /*ソケットの名前:::ポート部分*/ 118 119movq $0, %rdi 120call htonl /*ソケット通信で利用できる形に変更*/ 121movl %eax, -1996(%rbp) /*ソケットの名前:::IPアドレス部分*/ 122 123 124 125main6: /*ソケットに名前を付ける*/ 126leaq -2000(%rbp), %rsi 127movq -2024(%rbp), %rdi 128movq $16, %rdx 129call bind 130cmpq $-1, %rax 131jne main7 132movq $err4, %rdi 133call perror 134leave 135ret 136 137 138 139main7: /*ソケットで接続の受付を開始する*/ 140movq -2024(%rbp), %rdi 141movq $10, %rsi /*待ち行列の長さ*/ 142call listen 143cmpq $-1, %rax 144jne main8 145movq $err5, %rdi 146call perror 147leave 148ret 149 150 151 152main8: /*"wait for conaction"と表示*/ 153movq $output1, %rdi 154call output 155 156 157 158main9: 159movl $32, -1984(%rbp) 160leaq -1984(%rbp), %rdx 161leaq -1980(%rbp), %rsi 162movq -2024(%rbp), %rdi 163call accept 164movl %eax, -1940(%rbp) 165cmpq $-1, -1940(%rbp) 166jne main10 167movq $err6, %rdi 168call perror 169leave 170ret 171 172 173 174main10: /*クライアントからの接続要求を読み込む*/ 175movl -1940(%rbp), %edi 176movq $buffer, %rsi 177movq $1024, %rdx 178call read 179cmpq $0, %rax 180jne main11 181movq $err8, %rdi 182call perror 183leave 184ret 185 186 187 188main11: /*htmlファイルの情報をsocketに書き込む*/ 189xorq %rdx, %rdx 190movl -1940(%rbp), %edi 191leaq -1936(%rbp), %rsi 192movl -1944(%rbp), %edx 193call write 194cmpq $-1, %rax 195jne main12 196movq $err9, %rdi 197call output 198leave 199ret 200 201 202 203main12: 204movq -1940(%rbp), %rdi 205movq $2, %rsi 206call shutdown 207movq -1940(%rbp), %rdi 208call close 209movq $output3, %rdi 210call output 211jmp main8 212 213 214 215output: /*画面に標準出力する関数(%rdi=data)*/ 216movq %rdi, -20(%rbp) 217call strlen /*文字dataの大きさを所得*/ 218movq %rax, %rdx 219movq -20(%rbp), %rsi 220movq $2, %rdi 221call write /*文字をwriteシステムコールで標準出力*/ 222ret 223

HTML

1HTTP/1.0 200 OK 2Date:Tue,06,Feb 2018 11:07:43 GMT 3Content-Type:text/html;charset=utf-8 4Content-Length:1234 5 6<!DOCTYPE html> 7<html> 8 <head> 9 <title>test.html</title> 10 </head> 11 <body> 12 <h1>This is test.</h1> 13 </body> 14</html> 15

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

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

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

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

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

dodox86

2018/12/16 17:53

C言語ではないのでタイトル表記、タグなど適切に修正されることをおすすめします。
guest

回答1

0

ベストアンサー

問題の原因はサーバー側プログラムが返しているHTTPレスポンス(ファイル test.html)の内容にあります。ファイルの内容はHTTPレスポンスの内容全体になっていますが、ここで、Content-Length:1234と記述しているものの、「<!DOCTYPE html>...」と続くコンテントボディ部分は150バイトしかないので、FireFoxやSafariでは残りの足りない部分の受信を待ってしまっています。つまり、FireFoxやSafari等のHTTPクライアント側では、1084(1234 - 150)バイトを受信できるはずと認識して動作しているものの、サーバー側でその前に接続を切っているので、ブラウザ側で正しく表示できません。FireFoxとSafariの動きで違うのは途中で切断された後の挙動の違いからくるものでしょう。

まとめると、コンテントボディ部分は150バイトなので、Content-Length:150と記述する必要があります。※実際は改行コードの違い(LFのみか、CRLFか)でサイズが変わってきますので気をつけてください。

  1. 質問内容1の回答

1回のリクエストに対してサーバーが2回応答しているのではなく、FireFoxやSafariが2回以上リクエストしているのだと思われます。サーバー側が正しいHTTPレスポンスを返す前に切断する為、HTTPクライアントであるブラウザ側がリトライをしているのでしょう。

  1. 質問内容2への回答

正しいHTTPレスポンスを返すようにすればFireFoxでもSafariでもChromeでもブラウズできるようになります。

以下はサーバー側が返すHTTPレスポンスとして正しい例です。Content-Length:部分が違うだけです。

Plain

1HTTP/1.0 200 OK 2Date:Tue,06,Feb 2018 11:07:43 GMT 3Content-Type:text/html;charset=utf-8 4Content-Length:150 5 6<!DOCTYPE html> 7<html> 8 <head> 9 <title>test.html</title> 10 </head> 11 <body> 12 <h1>This is test.</h1> 13 </body> 14</html>

投稿2018/12/16 17:52

dodox86

総合スコア9183

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

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

binary

2018/12/16 21:00

回答ありがとうございます。 回答の通り適切にContent-Lengthの値を適切な値に変更するとしっかりと表示されました。 htmlを全く勉強せず実装してしまったのでこのような失敗をしたと反省しています。 本当に助かりました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問