『Land Of Lisp』という書籍で簡易的なWebサーバを作る章の勉強をしています。
ポート8080にソケットを開いて、ブラウザで以下(p259)を入力したのですが、接続が拒否されてしまいます。
Lisp
1;;処理系はClispです 2(defun serve (request-handler) 3 (let ((socket (socket-server 8080))) 4 (unwind-protect 5 (loop (with-open-stream (stream (socket-accept socket)) 6 (let* ((url (parse-url (read-line stream))) 7 (path (car url)) 8 (header (get-header stream)) 9 (params (append (cdr url) 10 (get-content-params stream header))) 11 (*standard-output* stream)) 12 (funcall request-handler path header params)))) 13 (socket-server-close socket))))
以下のコマンドでポート8080が正常に機能していることは確認済みですので、localhostに接続できていないことが原因であると考えています。
lsof -i :8080
いろいろと解決策を調べている中で、以下は試しました。
・ファイアーウォールの設定で、Google Chrome.appの接続を許可
・プロキシの設定で、「プロキシ設定を使用しないホストとドメイン」に*.localがあることを確認
原因の調査方法・調査観点などをご教示いただければと思います。
よろしくお願いします。
【追記】
Apacheの起動を行なっていなかったため、以下コマンドでhttp://localhostと打ち込んで「It works!」と表示されるところまでは確認できたのですが、ポート8080に接続しようとすると反応のない状況です。
sudo apachectl start
インターネットとの接続を切ったが状態で、ファイアウォールも無効化して確認することはできますか?お手元のpcからだとは思いますが。もしくは、違うプロセスが8080番を使っているかもしれません。
ご提示のソースコードが何ページに載っているか明記して下さい (書籍を見られる方が確認できるように)。あと、コードは正確に引用されているでしょうか (ご提示のコードを見る限り、socketに何か代入している箇所がないのですが)。
> suamaさん 確認しましたが、「127.0.0.1 ページは機能していません ERR_INVALID_HTTP_RESPONSE」のエラーになりました。lsof -i :8080で調べると、COMMANDとして、lisp.runが8080を使っていることになっていたため、ポートの接続には問題ない状態です。
>ikedasさん ご指摘の通り修正しました。また、ソースコードについてもご指摘の通りsocketを定義する箇所が漏れていたため修正しました。
書籍で確認できていなくてすみませんが、修正いただいた後のコードでは (let …) の括弧が (unwind-protect …) の前で閉じています。「socket」の直前に「(」がもう1個いるのでは。
>ikedasさん ご指摘の通り誤記です。修正しました。