socketが使えない!

[上に] [前に] [次に]
IKEJI [E-Mail] 1999/12/11(土) 11:55:53
このページを参考にして、このようなスクリプトを作ったのですが(ほとんどそのまんま)、
エラーが出てうまく動いてくれません。
どうしたらいいですか?
----------スクリプト-----------------
#!/usr/local/bin/perl

    $addr = (gethostbyname("www.and.or.jp"))[4];
    $name = pack("S n a4 x8", 2, 80, $addr);
    socket(S, 2, 1, 0);
    connect(S, $name);
    select(S); $| = 1; select(stdout);
    print S "GET /index.html HTTP/1.0\n\n";
    while (<S>) { print; }
    close(S);
--------------エラー------------
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, webmaster@freeweb.ne.jp and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.
-------------------
ローカルではちゃんと動くんですが、、

きたむら 1999/12/11(土) 14:49:20
CGIとして動作させてWebブラウザで結果を見たいということなら、最初に、
print "Content-Type: text/plain\n\n";
としてHTTPヘッダを出力する必要があります。はずしてたらすみません。

きたむら 1999/12/11(土) 15:26:12
いやまて、このスクリプトならサーバはHTTPヘッダも付けてデータを返すですね。やっぱりはずしてました。

IKEJI [E-Mail] 1999/12/11(土) 15:32:36
試してみましたが、なにも表示されませんでした。
それに私のパソコンでは動くのです
   ~~~~~~~~~~~
ためしに使っているのはFREEWEBです。

きたむら 1999/12/11(土) 15:33:33
ファイル名を "nph-hoge.cgi" としてnphスクリプトにすると動作するようになりました。
"hoge.cgi" などの名前の通常のCGIスクリプトだとエラーになるのはなぜ?

IKEJI 1999/12/11(土) 16:10:42
私のところでは動きません
NPHを開放してないのかも

IKEJI 1999/12/11(土) 16:11:00
私のところでは動きません
NPHを開放してないのかも

IKEJI 1999/12/11(土) 16:11:25
しまった二重投稿だ!?

きたむら 1999/12/11(土) 16:28:17
何度も出てきてすいません…。
Apach1.3.9で確認したんですが、socketが返す生のHTTPヘッダから
HTTP/1.1 200 OK
のようなステータス行を取り除くと、非NPHなCGIとして実行しても、Apacheは文句をいいません。
以下のように、HTTPで始まる行をすべて削除するという乱暴なテストで試しました。

>while (<S>) { print; }

while (<S>) { print if !/^HTTP/; }
に変更

IKEJI 1999/12/11(土) 19:01:05
[[解決]]
ありがとうございます。
これで解決しました。

させっち [E-Mail] 1999/12/14(火) 04:12:38
えーー同じfreewebなんですけどエラーでますよーーー


#!/usr/local/bin/perl

    $addr = (gethostbyname("www.and.or.jp"))[4];
    $name = pack("S n a4 x8", 2, 80, $addr);
    socket(S, 2, 1, 0);
    connect(S, $name);
    select(S); $| = 1; select(stdout);
    print S "GET /index.html HTTP/1.0\n\n";
while (<S>) { print if !/^HTTP/; }
    close(S)

これじゃあだめなのかな?

moci 1999/12/14(火) 05:08:45
nphでない場合は、HTTP/1.1 200 OKではなくて
Status: 200 OK とする必要があるということは?

http://www.tohoho-web.com/wwwcgi3.htm#CgiHeader

させっち 1999/12/14(火) 05:22:21
やってみました。
あいかわらず、ローカルではうまくいくんですよ。
Status: 200 OK でもうまくいきました。
でもどうしてもさーばではうまくいかないです。
じつはsocketが入ってなかったとか・・?

きたむら 1999/12/16(木) 10:58:33
>nphでない場合は、HTTP/1.1 200 OKではなくて
>Status: 200 OK とする必要があるということは?

mociさんのおっしゃる通りでした。
結局ソケット接続先のサーバが返すのは、あくまでもUA向けのHTTPヘッダで、自分側のWebサーバにそのまま渡せるとは限りません。
基本的に、ソケットから返されたHTTPヘッダは捨てて、あらためてヘッダを付け直すと問題が起きにくと思います。

簡略化した例。
while (<S>) { last if /^\s*$/; } #HTTPヘッダを読み捨てる
print "Content-Type: text/html\n\n"; #自分でヘッダを付け直す
while (<S>) { print; } #ヘッダ以降を出力

IKEJI 1999/12/20(月) 23:33:42
多分FREEWEBなどでは、SOCKETに対応していないと思います。
対応している無料で落ちないサーバーはありますかねぇ

[上に] [前に] [次に]