|
68Userさん、早速のお返事有り難うございます。 スクリプトは確認したと思うのですが、再度、確認してみます。 もし、また分からないことがあれば、お聞きするかもしれませんが、 よろしくお願い致します。 Ta |
|
度々すいません。Taです。スクリプトにミスがありました。その後、デバックをしてみると、全てパスしました。 TEST 1: script and permissions Passed Test 1! TEST 2: script file format Passed Test 2! TEST 3: check perl path Passed Test 3! TEST 4: perl syntax t_whois.cgi syntax OK Passed Test 4! Your script has passed all 4 tests. If your script passes these tests, and still won't run, you might look for one or more of these common problems: 1) make sure it can find any files or external programs it needs 2) make sure any included perl programs also check out 3) make sure you are writing a "Content-type:" line at the beginning of your output Consult your favorite Perl/CGI book for more information. これで動くかと思ったら、Internal Server Error・・・ う〜ん、なんでだか分かりません。environment.plは、$whoisのパスを修正するだけで、いいはずですよね。 何か、チェックしてみるところがあったら教えて下さい。 Ta |
|
とりあえず、 > open(STDOUT,"|$nkf -j"); open(STDOUT,"| /usr/local/bin/nkf -j"); > &put_header("whoisしてみよう -- $domain --"); print "Content-type: text/html\n\n"; print "<HTML>\n<HEAD><TITLE>whoisしてみよう -- $domain --</TITLE></HEAD>\n"; print "<BODY ...(略)...>\n"; > &finish_work; print "</BODY>\n</HTML>\n"; などと書き換えて、environment.pl なしで動くようにしてみて下さい。 それはそれとして なぜ動かないかというと、CGI 経由で実行した際に environment.pl が読み込めているかどうかが気になります。 if ( ! require 'environment.pl' ){ print "Content-type: text/plain\n\nCan't load environment.pl\n"; exit; } てな感じでチェックするといいでしょう。 |
|
初めまして〜m(_ _)m ちょっと聞きたい事があるのですが、unixでmoにデータをセーブするにはどうすればいいんでしょうか? 環境はあるみたいなのですが、やり方が分かりません。 因みにroot権限はないです。 unixはsolarisです。 |
|
68Userさん、色々とアドバイス有難うございます。 どうしてもうまくいきません。'nkf'のパスが間違っているのでしょうか? ('environment.pl'を使わない方法で行ってみました) 'whois'も、結局、調べたところ、'/bin/whois'でしたし・・・ 今晩、また挑戦してみます。 |
|
まずは #!/usr/local/bin/perl $|=1; print "Content-type: text/plain\n\n"; print `/bin/whois yahoo.co.jp@whois.nic.ad.jp` ここから始めましょう。これでダメなら whois の問題です。動いたら #!/usr/local/bin/perl $|=1; open(STDOUT,"|/usr/local/bin/nkf -j"); print "Content-type: text/plain\n\n"; print `/bin/whois yahoo.co.jp@whois.nic.ad.jp` として下さい。これでダメなら nkf のパスが問題です。 whois.nic.ad.jp は JIS コードを返しますが、whois.cgi は EUC で書かれているので、nkf で文字コードを統一しています。 なので、細かい事を言うと上の例では nkf は要りません (スクリプトが EUC を (というか、日本語を) 出力していないから)。 > unixでmoにデータをセーブするにはどうすればいいんでしょうか? ここらへんがヒントになるでしょうか。 http://www.pfu.co.jp/x86/faq/ 僕自身は経験がないのでわかりません。 |
|
「HTTP クライアントを作ってみよう」と、2000/01/12(水) 20:56の proxyに関する書き込みを参考にしたら、簡単なproxyサーバーが、 簡単に作れました。ありがとうございます! # でも、数行の追加じゃ済まなかったなぁ。もっと修行すれば # 出来るようになるんだろうけど・・・ |
|
なにやらいろいろ大変そうですね。 ところで掲示板の話なんですが…。 ログの管理とか、なんかいい案浮びました? 俺はあんま考えてないですけど。 それとうちの掲示板、過去ログ一覧をちょっと 並べ替えてみました(なにやってんだか…)。 もしよかったら使ってやって下さい。 それではまた。 |
|
> # でも、数行の追加じゃ済まなかったなぁ。 そうでしたか。実際に作ってみたわけではないので、そうかもしれません。 ただ、実用で使おうとすると、マルチスレッド化しないといけませんが、 その場合は結構行数は増えますね。 > ログの管理とか、なんかいい案浮びました? ログを1つのファイルにまとめるか、1.txt・2.txt…と分けるか、ですか? 実際のところ、それぞれメリット・デメリットがありますから、難しいですね。 # <Email ....> 方式はやめようと思ってます。<Email>....</Email> スタイルに # するつもり。 それはそれとして、後者のログ管理方式にしてくれ、ということなら どちらでも選べるように改造しますけど どうします? > 過去ログ一覧をちょっと並べ替えてみました 個数が多くなると、見やすいですね。参考にさせていただきます。 ところで ML の件ですが、has のところでやってもらえません? うちは後任の管理者がいないので、この時期に始めるのはあきらめました。 |
|
やっと、自力でCGI設置出来ました。 CGIをやろうとしてから実に二年もかかってるんですけど パーミッションとperlと言う言葉の意味がやっと分かりました 次は自作に燃えて居たら、CGI プログラムのはじめの一歩 って言うコンテンツが在ったので嬉しいです。perlパソに入れて CGIの本買ってきますよー。なんか、CGI設置できたのが 嬉しくて、68userさんに報告がしたかったのですー ヒトの作ったCGIがうごいたってだけなんですけど、嬉しかったです。 |
|
> perlパソに入れて CGIの本買ってきますよー。 それはよいことで御座います。やはり自作するのが一番楽しいわけで、 ぜひ勉強してみて下さい。 ただし、他人に聞く前に「まず本を読む、まず自分で調べる」という ことは必ず行うようにして下さい。自分で調べられない・自分で 調べる気のない人は、上達しませんから。 |
|
はじめまして、たまりと申します。 CGI、特にperlを勉強中の物です。 「ネットワークプログラミングの基礎知識」、滅茶苦茶参考になりました。 ありがとうございます。 現在、68userさんのスクリプトを参考に、FTPクライアントを書いているんですが、 どうもSTORがうまくいきません。 ファイルが送信し終わるまでに接続を切られてしまい、FTPdがファイルハンドルを 解放しないような状態になってしまいます。 当方の環境はというと、Windows98 + ActivePerl build 521 + TinyFTPDaemon Ver 0.51です。 HDの転送速度が追いつかないのかなと思い、以下のようにウェイトを入れてみても だめでした。 while (<IN>) { print DATA $_; $i = 10000; while ($i) {$i--;} } 上記のコードはPassiveモードでサーバが開いたDATAポートにINファイルをPUTして いる部分だとお考え下さい。 結果として転送速度は確かに下がったのですが、ファイルハンドルを解放しない (=FTPdが「受信が完了しました」と言わない」)という症状は改善されません。 なお、環境の制限により、シングルスレッドで書いています。 これは、環境による原因があるのでしょうか? それともコーディング上の問題があるのでしょうか? よろしければご教示下さい。 |
|
> ファイルが送信し終わるまでに接続を切られてしまい 何バイト送ったら切れる、などという再現性はありますか? 1バイトずつ送ってみるとどうでしょう。また、切れるのは データコネクションですか? コマンドコネクションですか? > FTPdがファイルハンドルを解放しないような状態 というのは具体的にはどういう状態ですか? これもデータコネクションかコマンドコネクションかを教えて下さい。 あと、このコードの前後数行を見せてもらえますか? > HDの転送速度が追いつかないのかなと思い これはさすがにないと思いますよ。Windows といえども OS ですから、 そこらへんはきっちりやってくれるでしょう。 ちょっと急いでいるので、この辺で。 |
|
> これはさすがにないと思いますよ。 仮に HDD がとても遅かったとしても、 >> while (<IN>) { でブロッキングするだろうから、読めなかったけど処理が 先に進むなんてことはないと思う、ということです。 # ここでブロッキングしてくれないと、OS の意味がない。 |
|
初めまして、セガBBSの過去ログ凄いです、 ご苦労様としか言えません、 また、じっくり見させてもらいにきます、 (今からみるんだけど、、、) |
|
> 何バイト送ったら切れる、などという再現性はありますか? 再現性はないようです。 接続が切られた時点でのサイズは不定でした。 > 1バイトずつ送ってみるとどうでしょう。 えっと、具体的にどのようにすればいいんでしょうか? readで1バイトずつ読んでいくのでしょうか。ちょっと試してみます。 > また、切れるのはデータコネクションですか? コマンドコネクションですか? すいません、説明が足りなかったようで。 どうやらQUITは送信されているようなのでデータコネクションが切られているようです。 >> FTPdがファイルハンドルを解放しないような状態 FTPdが起動中はエクスプローラからもファイルの削除等ができません。 もちろんスクリプトが終了していても、です。 FTPdを終了させると、送信したファイルが元サイズ以下(不定)であるという感じです。 そうなると削除等も可能になります。 「データコネクションかコマンドコネクションか」というのは自分にはわかりません。 > あと、このコードの前後数行を見せてもらえますか? 以下のようになります。 ほとんどftptrans.plを流用させて貰ってます(^^; if ($mode eq 'put') { &send_command(COMMAND, "STOR $target_file\r\n"); } elsif ($target_file =~ m|/$|) { &send_command(COMMAND, "LIST $target_file\r\n"); } else { &send_command(COMMAND, "RETR $target_file\r\n"); } &client_work(DATA, $data_connection_host, $data_connection_port); open(IN, $infile) || die "$infile: $!"; binmode(IN); while (<IN>) { print DATA $_; } close(IN) || die "close: $!"; &read_response(COMMAND); close(DATA) || die "close: $!"; &send_command(COMMAND, "QUIT$CRLF"); &read_response(COMMAND); close(COMMAND) || die "close: $!"; > # ここでブロッキングしてくれないと、OS の意味がない。 当てがはずれてたようですね(^^; 実際改善されなかったですし。 ファイルが送信し終わる前にQUITが送信されてると言うことはデータコネクションが 切断される前にコマンドコネクションが切断されると言うことでしょうか? 確かFTPってデータコネクションの切断=データの終わりでしたよね? でもcloseでは死んでないようだし・・・ とりあえず1バイトずつを試してみます。 |
|
あ、すいません、訂正です > &send_command(COMMAND, "QUIT$CRLF"); &send_command(COMMAND, "QUIT\r\n"); です。 # 普段$CRLF="\r\n";でやってるもので(^^; |
|
> メリクリウスさん メールの返事をここでさせて頂きますが、人の多いところから リンクしちゃダメなのは、お肉さんのところです。うちは どこからリンクしても構いませんです。 > FTPdが起動中はエクスプローラからもファイルの削除等ができません。 FTPd が STOR 先のファイルをオープンし続けているということですね。 謎ですね。 こちらには Windows 環境がないので、そのものずばりの答えは わかりませんが、思いつくままに。 1. まずは小さなファイルでやってみて下さい。 2. sub client_work の最後で、SOCK のバッファリングを OFF にしている ($|=1) のは削ってませんよね? 3. QUIT 送信の前に &read_response(COMMAND) が一つ足りてないんじゃない ですか? データコネクションが確立したら、 150 Binary data connection for test/hogemoge (127.0.0.1,33299). というレスポンス、さらに転送が完了したら 226 Transfer complete. というレスポンスが返ってきませんか? (でもこれが原因じゃないと思う。レスポンスを読まなくても転送はできるはず) 4. $verbose=1 にして、プロトコル眺めてますよね? 5. passive なら、telnet コマンドだけを使って送信してみるのもいいかも。 6. ftp にデバッグオプションを付けて、プロトコルを観察してみては。 >> 1バイトずつ送ってみるとどうでしょう。 > えっと、具体的にどのようにすればいいんでしょうか? 例えばこんな感じです。 &send_command("STOR $target_file\r\n"); &client_work(DATA,$data_connection_host,$data_connection_port); &read_response(COMMAND); use IO::File; sysopen(IN,$infile,O_RDONLY); binmode(IN); # sysopen なら不要かな? while (1){ $nread = sysread(IN,$buf,1); $read_size += $nread; last if ( $nread == 0 ); print "$read_size read "; print DATA $buf || die "$!"; # 成功したかどうかチェック print "$read_size send.\n"; } close(DATA); close(IN); &read_response(COMMAND); &send_command("QUIT$CRLF"); &read_response(COMMAND); close(COMMAND); とりあえず、何バイト目でこけているのかは調べられるでしょう。 ただし、パケットレベルで 1バイトずつのデータが送られる、という 保証はありません。 念には念を入れて、print DATA の代わりに syswrite(DATA,...) を 使ってみるのもいいかも。 # syswrite = select(DATA);$|=1;binmode(DATA);print DATA と # 同じはずだと思うんですが、違いましたっけ。 Solaris の ftpd 相手に試していて思ったんだけど、 http://X68000.startshop.co.jp/~68user/net/ftp-5.html > 次のアクションは > データコネクションの確立なのか > コマンドコネクションからのエラーレスポンスなのか > のどちらなのかが わからないのです。 こんな変な仕様は、もしかして FreeBSD の ftpd だけかもしれない…。 調べておかねば。 |
|
はじめまして。ゲームでわからない事があったので、誰か教えて下さい。 「七ツ風の島 物語」というゲームなのですが・・・ (知っている人、いるかなぁ・・・) 第11章 『小さくてキレイな物』・・・で、どうしたらいいのか、わかりません。 あった事といえば、白ガラスのヒューと、カンぞうに会った事です。できれば、わかる人、教えてください。よろしくお願いします。 |