1

socatを使用してbashでWebサーバーを作成しようとしています。画像リクエストの処理に問題があります。私は socat リスニング接続を次のように開いています:

socat -T 30 -d -d TCP-L:$LISTENIP,reuseaddr,fork,crlf SYSTEM:"$0 \"docroot=$DOCROOT\""

$1 はドキュメントルート、$2 は画像ファイル名です。

function serve_png {
  if [ -e $1$2 ]
  then
    SIZE=`stat -c '%s' $1$2`
    echo -ne "HTTP/1.1 200 OK\nContent-type: image/png\nContent-length: $SIZE\n\n"
    cat $1$2
  else
    echo -ne "HTTP/1.1 404 Not Found\nContent-type: text/html\n\n404 - Not found\n"
  fi
}

「エラーが含まれている」ため、画像は Firefox で表示できません。コンソールに次の出力が表示されます。

2014/01/25 08:00:41 socat[11551] N listening on AF=2 0.0.0.0:8080
2014/01/25 08:00:45 socat[11551] N accepting connection from AF=2 $MYIP:55765 on AF=2 $SERVERIP:8080
2014/01/25 08:00:45 socat[11552] N forking off child, using socket for reading and writing
2014/01/25 08:00:45 socat[11551] N forked off child process 11552
2014/01/25 08:00:45 socat[11551] N listening on AF=2 0.0.0.0:8080
2014/01/25 08:00:45 socat[11552] N forked off child process 11553
2014/01/25 08:00:45 socat[11552] N forked off child process 11553
2014/01/25 08:00:45 socat[11552] N starting data transfer loop with FDs [4,4] and [3,3]
2014/01/25 08:00:45 socat[11552] W read(3, 0x8e2e388, 8192): Connection reset by peer
2014/01/25 08:00:45 socat[11552] N socket 2 to socket 1 is in error
2014/01/25 08:00:45 socat[11552] N socket 2 (fd 3) is at EOF
2014/01/25 08:00:45 socat[11552] N socket 1 (fd 4) is at EOF
2014/01/25 08:00:45 socat[11552] N socket 2 (fd 3) is at EOF
2014/01/25 08:00:45 socat[11552] N exiting with status 0

netcat を使用して同様のスクリプトを見たことがありますが、socat を使用して動作させることができません。複数の接続をフォークして処理する機能があるため、socat を使い続けたいと思います。任意の洞察をいただければ幸いです。

4

1 に答える 1

0

Steffen Ullrich は、socat コマンドから crlf フラグを省略してそれを実現しました。キャリッジ リターン/ライン フィードが socat によって自動的にストリームに挿入される原因となっていました (そのため、ファイルが破損していました)。そのオプションを省略した後、すべてが期待どおりに機能しました。

于 2014-06-24T15:46:59.960 に答える