ソケットについて

[上に] [前に] [次に]
パブ論 1999/12/14(火) 14:31:59
えー
他のサーバに有るページを読み込んでそれをおこちゃま語にして
表示するって事をしたいんです。具体的には”す”を”ちゅ”
にしたりしたいんですよ。
まず、このページに有るソケットをsocketがつかえないって題名の過去ログを参考に致しまして

#!/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)

っていうことを書いてみました。
単純に他のページを読み込んで
表示ってスクリプトでlocalではうまくいきました。
しかし、させっちさんと同じようにサーバーに置くとエラーが出るのです。
エラー内容は
freeweb.ne.jpだと

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.

hypermart.netだと

えらー500ってなかんじです。
    print S "GET /index.html HTTP/1.0\n\n";
の部分を
    print S "GET /index.html Status: 200 OK\n\n";
ってしても結果は同じでlocalでは動くのにサーバー(freewebとhypermart)ではエラーが出ます。

一体どこがいけないんでしょうか?おねがいします。
さらに、データの読み取る事ができる
localで
@lines = <S>;
foreach $line (@lines){
$line =~ s/です/でちゅ/g;
print $line;
}
ってなことをやってみたんですけど
うまく置換されてませんでした・・

長々と書いてしまいましたがおねがいします。

miyu [E-Mail] 1999/12/14(火) 18:57:24
私も以前同様な質問をしまして,そのときのやりとりがもしかしたら
お役に立つかも知れません.
../199907/99070250.htm

要は,プログラムの中の
>socket(S, 2, 1, 0);
の2とか1というのは,OSの種類によって意味が異なるということです.
freeweb.ne.jpのOSが何か分かりませんが,その辺りを疑ってみて下さい.

B-Cus 1999/12/14(火) 23:48:58
> えらー500ってなかんじです。
CGI なんだから、Content-type を付ける。
evaってエラー箇所を調べる。

> print S "GET /index.html Status: 200 OK\n\n";
GET は HTTP の話。Status は CGI の話。

> うまく置換されてませんでした・・
文字コードが違ってないか調べる。なるべく EUC を使うべし。

> の2とか1というのは,OSの種類によって意味が異なるということです.
Socket モジュールを使う (perl5 専用)。


…というわけで、最初の一歩としては こんな感じ。

#!/usr/local/bin/perl

sub error{
  print $_[0];
  exit;
}

use Socket;
$eval_str=<<'END';
$port = getservbyname('http','tcp');
$iaddr = inet_aton("www.and.or.jp")
        || error "resolv できません。\n";
$sock_addr = sockaddr_in($port,$iaddr);
socket(SOCKET,PF_INET,SOCK_STREAM,0)
        || error "ソケットを生成できません。\n";
connect(SOCKET,$sock_addr)
        || error "接続できません。\n";
select(SOCKET); $|=1; select(STDOUT);
print SOCKET "GET /index.html HTTP/1.0\r\n";
print SOCKET "Host: www.and.or.jp\r\n\r\n";

print <SOCKET>;
END

print "Content-type: text/plain\n\n";
eval($eval_str);
print "\$\@ is $@";

とあるfreewebユーザ 1999/12/15(水) 00:00:14
>freeweb.ne.jpだと

http://www.freeweb.ne.jp/freeweb/kiyaku.html#jouken
>付則:ホームページ運用条件
>第四条 CGI・SSIの利用
>CGIプログラム及びSSIコマンドの利用に関して、以下の内容を禁止いたします。
>7.CGI,SSIを通して、他人のファイルへアクセスすること。

B-Cus 1999/12/15(水) 00:08:30
HTTP 経由でアクセスすることは、ブラウザで web を見ることと同義です。
>7.CGI,SSIを通して、他人のファイルへアクセスすること。
なので、関係ないでしょう。そもそも HTTP は、世界中へファイルを
公開するために存在するので。

# まぁ、「ソケット使用禁止」ってとこもありますので、不安なら
# freeweb 管理者にソケット使っていいですか、と聞くのが一番。

B-Cusさんへ 1999/12/16(木) 09:58:27
>> えらー500ってなかんじです。
>CGI なんだから、Content-type を付ける。
>evaってエラー箇所を調べる。

evaって何ですか?(ホントにわからないんです(泣))

B-Cus 1999/12/16(木) 10:19:01
eval 文を使うことです。
# 少なくとも僕の中では。

P初心者 1999/12/16(木) 11:06:01
「B-Cusさんへ」さんへ 以下が参考になると思います!

../199912/99120228.htm

きたむら 1999/12/16(木) 11:06:33
えーこれはソケットが使えるのを確認された後の話になりますが、
>while (<S>) { print if !/^HTTP/; }
というのは、さすがに乱暴すぎるので、元スレッドに追加書き込みしました。
../199912/99120190.htm

パブ論 1999/12/16(木) 11:21:19
たくさんの意見ありがとうございます
何とかうまくいきそうです。
リンクも参考になりました。
ところで
@lines = <S>;
foreach $line (@lines){
$line =~ s/です/でちゅ/g;
print $line;
}
とかってした場合、
@linesって、やっぱ一行ずつ読み込まれるものなんですか?
それとも一文字ずつなのかな?

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