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
回答1件
あなたの回答
tips
プレビュー