>> 自分勝手に判別するルーチンを 変造しています。 > では早速拝見…と思ったら、getcode.pl が not found なようで…(^^; Link 直しました(^^;;; http://www2d.biglobe.ne.jp/~gama/cgi/jcode/jcode.htm |
http://www2d.biglobe.ne.jp/~gama/cgi/jcode/k-jis.htm こちらのページなんですが、JISで8bitの半角カナを使っている ようですが、ESC ( I で7bitのカナを使うのが普通だと 思うのですが。学校のFreeBSD-3.3+NC4.7ではSJISやEUCのページは 見えるのですが(半角カナも)、ここだけ化けてしまいます。 家の環境(Win95+NN3.04)ではここも文字化けしていないのですが、 ソースを見た時、半角カナの部分だけJISが化けていないので 気になっていました。 |
> こちらのページなんですが、JISで8bitの半角カナを使っている > ようですが、ESC ( I で7bitのカナを使うのが普通だと > 思うのですが。学校のFreeBSD-3.3+NC4.7ではSJISやEUCのページは > 見えるのですが(半角カナも)、ここだけ化けてしまいます。 あ、なるほど、現在のは手許の Win95 上のエディタでコード変換を 処理した結果なので、多分半角カナが 8bit なんですね。 ずーっと、それでいいと思いこんでました。 7bit 半角カナとかいうと、20 年以上くらいの規格という思いこみがあった わけです。 > 家の環境(Win95+NN3.04)ではここも文字化けしていないのですが、 > ソースを見た時、半角カナの部分だけJISが化けていないので 気になっていました。 |
ゲーム系掲示板を作ってみたので使ってみて |
PC上で、C++で作成したDLLを、UNIX上で使えるようにしたいのです。 どのようにしていけばよいか、教えてください。 C++内でどのような変換を行い、UNIX上にてコンバートすればよいのでしょうか? |
質問があります。よろしくお願いします。 % ls ファイル名 とした時に該当ファイルが無かった場合 ls:No match. と出ますがこのメッセージを出さない方法が ありましたら教えて下さい。 |
> C++で作成したDLLを、UNIX上で使えるようにしたいのです。 Windows は全く知りませんが (DLL ってランタイムライブラリ ですよね? というくらいしか知らない)、DLL を UNIX に 持ってくるのはさすがに無理でしょう。 C++ のソースを持ってきて、ar でアーカイブ作るか、ld で ランタイムライブラリを作るのがまっとうな方法だと思います。 > ls:No match. > と出ますがこのメッセージを出さない方法 「No match」が出るのは 「tcsh で、ワイルドカードを使って、マッチしなかったとき」 だと思いますが、 % (ls hoge* >/dev/tty) >& /dev/null で、標準エラー出力をリダイレクトするとか、 % set nonomatch % ls hoge* として、マッチしなかったときにエラーにさせないようにするとか、 % set noglob % ls hoge* として、最初からワイルドカードを展開させない、などの方法があります。 |
はじめまして。 perlでメールを受信する方法を調べていたところ、こちらの掲示板を 発見しました。 お尋ねしたいことは、pop3サーバーからメールを受信し、そのメールの 添付ファイルをWindowsのフォルダに保存する方法です。 UNIXやCGIの経験が全く無い素人なもので、なかなかうまくいきません。 参考になるURLや書籍等もありましたら教えていただけないでしょうか。 OSはWindowsNT4.0又はWindows95です。 宜しくお願いします。 |
POP へのアクセスは http://X68000.startshop.co.jp/~68user/net/ を読んで下さい。 multipart メールをバラすのは、perl の MIME-tools モジュールで できそうな感じです (試したことないので)。わからなかったら また質問して下さい。 |
> multipart メールをバラすのは、perl の MIME-tools モジュールで perl の MIME-tools、IO-stringy、MailTools モジュールを 入れて、perldoc MIME::Parser のサンプル通りやってみたら あっさりできました。モジュールに頼ると簡単だなぁ。 |
: : 信じられないけど本当の話。 : : 私はある日BBSで1000円が200万円に、、、とかいてあるのを見た。 : : 200万円ものお金が郵送されてくると書いてあった。 : : まさか、そんなには、、、と思ってはみたが、 : : やらなきゃ何もはじまらない、まぁ、何もなくて1000円くらいの損だし、、、 : : ま、数万くらいは、、、、。と、思っていた。 : : (ホントに軽い気持ちで)だから、そのBBSのとおりにやってみた。 : : 私がやったことは、書き換えたファイル(この文書です)を : : ニュースグループやBBSの電子掲示板などに(!!出来るだけ多くの!!) : : アップロードした。 : : そして私はお金が来るまでどきどきしながら待っていた。 : : 私は10万円や15万円ぐらい来る時しまうところを確保していた。 : : でも、、、。お金の入った封筒がどんどん郵便受けに入ってくるのには、 : : 仰天した。!! さて、私にいくらお金が送られてきたでしょう? : : 10万?20万?50万?私は合計!!!約200万円!!!嘘、、、、、。 : : このお金を目にしてまだしんじらんないって感じ!!! : : さて、その具体的な方法を書きます。ちゃんとファイルに保存しておくと良いよ。 : : あとで役に立ちます。君が払わなくてはいけない物は、5枚の切手、封筒、1000円。 : : それを、リストの5人に、合法的に現金を送る方法で送る。そして、君の名前と : : 住所が書いてある方のファイルをいろいろなところにアップロードする。 : : そうしたらたった1000円あげるだけで150万円から250万円の戻りが3〜5週間で : : 届きます!!!! : : では具体的にどうすれば良いか? : : * **名前と住所のリストは最後にあります。*** : : まず一枚の紙に「私をあなた方のリストに入れてください。」これを書くことにより、 : : このスーパーマネーシステムは成り立ちます。(合法になります。) : : あなたは200円をランダムに払うのではなくこのシステムに払うのです。 : : そうそう、紙に自分の名前と住所とあなたが出す人はリストの何番目にいたかを : : 書きます。 : : 1.(あなたはリストでは、○番目にいました)と、書きます。 : : 2.(1)で書いた紙を200円にまきつけましょう。そして封筒に入れ、 : : リストに書いてある5つの住所に送る。 紙を200円に巻きつけて、 : : 200円を見えなくするのにはワケがあります。 : : 郵便で現金を送ってはいけないのだ。郵便局に行って200円の5枚にしても良い。 : : 手数料10円。小為替だったらまく必要がないよ! : : * *このステップは重要です。** : : 3.さて、ここからが重要。よく読んで、システムを理解してね。 : : 一番上の人を消す。そして他の皆のポジションを一つずつ上げる。 : : つまり、ポジション2の人をP1に、P3の人をP2に、P4の人をP3に、P5の人をP4に : : かえるということ。そしてポジション5に君の名前、住所、郵便番号、国を : : 書きこむわけ。 : : 4.そして(3)で変えたこれのファイルをいろいろなところに出来る : : だけたくさんアップロードします。 : : アップロードしたぶん自分に跳ね返ってきます。 : : 自分と他の4人にもお金が入ることになります。 : : さて皆さん、リストについては正直にしましょう!! : : 汚い事しなくても、お金はいっぱい入るから。ウソは絶対に辞めましょう。OK? : : 5.ここまできたらもう後は人生楽しみましょう。 : : お金は着々と君の郵便受けに入ってきます。 : : 初めて2週間くらいからお金が入りはじめて3〜4週間目にはお金の台風が君の : : 郵便受けを襲います。 びっくりして叫ばないようにね。 : : お金がなくなってきたら又既に書き換えたファイルに(4)〜の行程を繰り返しましょう。 : : 絶対にこのファイルはなくさないように。 : : 何度でも使えるから。参考にしてください。 : : 名前と住所のリスト正直がこのプログラムを成功させる!!! : : 1. 横山美由紀 〒193-0932東京都八王子市緑町401−105 : : 2. 波多野絵梨 〒860-0085熊本県熊本市高平2-16-5 : : 3. 浦西弘明 〒524ー0101滋賀県守山市今浜町2620-14-216 : : 4. 村上健一 〒014-0722秋田県仙北郡中仙町豊川字下延17-2 : : 5. 小関リノ 〒080-0834北海道帯広市稲田町西1線5番地115 : : あなたに全くマイナスはありません!!!! : : 君にお金を送ってきた人の名前はなくさないようにしたほうが良いでしょう。 : : みんなで公平にこのシステムを使いましょう。 : : 最後に:正直がこのシステムを成功させるのです!!! : : もしもあなたがお金をリストの五人に出さない卑怯者だったらあなたはあまり : : お金をもらえない。私は誰かがお金をリストの五人に送らなかったので3万円(2ヶ月後に) : : しかもらえなかったのを知っている。それからお金をリストの5人に送ったのでリスト : : の人たちは彼をリストに入れてあげた。そして4〜5週間後に彼は200万円以上手に入れたのです。 : : これは本当の話ですよ!!! (ちょっとびっくり) : : だまされたと思って1000円出せばすごい大金が手に入ります!!!(上記のことから) : : このチャンスを大事にしましょう!!! |
はじめまして。Taと申します。 whois.cgiに関して、お聞きしたいことがあるでのすが、もしよかったら教えて下さい。 私のISPは、LINUX(Redhat)を使用しているため、68Userが作られたcgiのスクリプトの 一部を変更しなければならないことに気が付きました。 オリジナルでは、'whois -h whoisserver domain'となっていますが、Linuxでは、whois コマンドのパラメーターが違うようで、'whois domain\@whoiserver'('whois domain@whoiserver'というパラメーターも見たことがあるんですが)ということなので、スクリプト内の以下の部分のみを変更しました。 #変更前 $ret = `$whois -h $nics{$nic} $domain`; #変更後 $ret = `$whois $domain\@$nics{$nic}`; これにプラスして、当方のISPでは、'whois'が、'/bin'にあるので、'environment.pl'の'$whois'のパスも'/bin/whois'に変更しました。 ところが、サーバーエラーが出てしまいます。ISPで用意してあるデバックの機能(web から行う)を利用してみたところ、以下のような結果がでました。 ----------------------------------- 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 String found where operator expected at t_whois.cgi line 45, near "print "" (Might be a runaway multi-line "" string starting on line 33) (Missing semicolon on previous line?) syntax error at t_whois.cgi line 45, near "print "" t_whois.cgi had compilation errors. Your script failed one or more of the tests and could not be automatically corrected. Please correct the errors listed above and try again. ----------------------------------- 調べてみたところ、おそらく、変更した部分のが関係すると思うのですが・・・ 原因がよく分かりません。 もし、解決方法をご存知でしたら、ご指導頂ければ助かります。 Ta |
> (Might be a runaway multi-line "" string starting on line 33) > (Missing semicolon on previous line?) 「33行目から始まる "" が閉じてないのではないか?」 「前の行の最後にセミコロンを付け忘れていないか?」 ということでしょう。 > $ret = `$whois $domain\@$nics{$nic}`; これ自体は問題ありません。 |
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章 『小さくてキレイな物』・・・で、どうしたらいいのか、わかりません。 あった事といえば、白ガラスのヒューと、カンぞうに会った事です。できれば、わかる人、教えてください。よろしくお願いします。 |
返事が遅くなって申し訳ないです。 ここ二日ほど色々あって何もできませんでした(^^; > FTPd が STOR 先のファイルをオープンし続けているということですね。 です。FTPd側の問題という可能性も無くはない気もしますが(但し、普通の クライアントを使用した場合は当然ながらうまく送信できます) まず、先程試してみた結果から。 どうやら原因は > 3. QUIT 送信の前に &read_response(COMMAND) が一つ足りてない だったようです。 これを入れたらまともに動いてくれるようになりました。 念のため、詳しい報告も > 1. 小さなファイル(数KB程度)でも同様でした > 2. 削っていません。 > 4. とりあえずまともに動くようにしようと即興で作っていたので$verbose=1の部分は 削ってました(^^; 本来はそういうときこそ細かくデバッグすべきなんでしょうけど・・・ > 5. 6. telnetやftpを使えば問題なく送信できます。 なお、1バイトずつ読んでいく方法ですが、 print DATA $buf || die "$!"; ではデータ的に0x30、つまり'0'のところでなぜかdieするようです。 print DATA $buf; のようにするとうまくいきました。 また、syswriteに関しては使ったことがないのであまりわかりませんが、 引数はsysreadと同様な形で取って、返り値は書き込んだバイト数のようです。 また、binmodeはsysopenでO_BINARYを指定しておけば不要かと思います。 ありがとうございました。 |
> はじめまして。ゲームでわからない事があったので、誰か教えて下さい。 ここにはゲームに詳しい人はあまりいないような気がします…。 > どうやら原因は >> 3. QUIT 送信の前に &read_response(COMMAND) が一つ足りてない > だったようです。 なるほど。ちょっと不親切な ftpd ですね (と僕は思う)。 > ではデータ的に0x30、つまり'0'のところでなぜかdieするようです。 なんででしょう。調べてみよう。 > また、binmodeはsysopenでO_BINARYを指定しておけば不要かと思います。 ああそうか。(Cでいうところの) open でも改行コード変換できるんですね。 > こんな変な仕様は、もしかして FreeBSD の ftpd だけかもしれない…。 > 調べておかねば。 これは Solaris の ftpd でも同じでした。変なの。 |
はじめまして、ハリーと申します。 実は今、Kシェルを作っているんですが、シェル内で exportコマンドを打って環境変数を変更しようとし てもできませんでした。普通にexportコマンドを打 ってもダメなんですか?それとも出来ないのですか? シェル初心者なので、よくわかりません。 よろしく、お願いします。 |
export HOGE=FUGA で できませんか。 |
はい。 シェルの中でenvを打つと変更した環境変数に変わっているのですが シェルが終ってもう一度、envを叩くと元に戻っています。 |
子プロセスでいくら環境変数をいじっても、親プロセスには 影響しません。これはどんなシェルでも同じです。 具体的に何をしたいのかがわからないのですが、 どうしてもやりたければ、eval を使うしかないです。 |
ありがとうございました。 やってみます。 |
はじめましてつると申します。 ネットワークプログラムについての質問なのですが、 今、いろいろと事情があって ここのページを参考にプロキシのようなサーバプログラムを 作成しております。 なにをするサーバかというと、ブラウザからのリクエストを受け取り そのリクエスト(GET,POST)を他のWebサーバにそのまま送りつけ そのWebサーバからのレスポンス(HTML)を受け取り、 ブラウザに返してやるサーバです。 このページのソースを参考にしています。 サーバ部分はecho-server.plを httpリクエスト部分はhttp-client.plを利用しましたが、 Webサーバまではリクエストが行っているようですが レスポンスがうまく表示されません。 なにか原因がわかりになるようでしたら 教えてください。 |
ソースはこんな感じです。 #!/usr/local/bin/perl -w use Socket; $server_port = 4989; # ソケット生成 socket(CLIENT_WAITING,PF_INET,SOCK_STREAM,0) || die "ソケットを生成できません。$!"; # ソケットオプション設定 setsockopt(CLIENT_WAITING,SOL_SOCKET,SO_REUSEADDR,1) || die "setsockopt に失敗しました。$!"; # ソケットにアドレス(=名前)を割り付ける bind(CLIENT_WAITING,sockaddr_in($server_port,INADDR_ANY)) || die "bind に失敗しました。$!"; # ポートを見張る listen(CLIENT_WAITING,SOMAXCONN) || die "listen: $!"; print "ポート $server_port を見張ります。\n"; # while(1)することで、1つの接続が終っても次の接続に備える while (1){ accept(CLIENT,CLIENT_WAITING); # HTTP プロトコルを使う $port = getservbyname('http','tcp'); # ホスト名を、IP アドレスの構造体に変換 $iaddr = inet_aton("xxx.xxx.xxx.xxx") || die "[xxx.xxx.xxx.xxx]は存在しないホストです。\n"; # ポート番号と IP アドレスを構造体に変換 $sock_addr = sockaddr_in($port,$iaddr); # ソケット生成 socket(SERVER,PF_INET,SOCK_STREAM,0) || die "ソケットを生成できません。\n"; # 指定のホストの指定のポートに接続 connect(SERVER,$sock_addr) || die "[xxx.xxx.xxx.xxx]のポート$portに接続できません。\n"; # ファイルハンドル SERVER をバッファリングしない select(SERVER); $|=1; select(STDOUT); # クライアントに対してバッファリングしない select(CLIENT); $|=1; select(STDOUT); # WWWサーバにHTTPリクエストを送る while (<CLIENT>){ print SERVER "$_"; print "$_"; } # ヘッダ部分を受け取る while (<SERVER>){ # 改行のみの行ならループを抜ける m/^\r\n$/ && last; } # ボディ部分を受け取り、表示 while (<SERVER>){ print CLIENT "$_"; print "$_"; } close(CLIENT); } とりあえず、サンプルをそのまま利用させていただいております。 おかしいところがあればご指摘下さい。 perl初心者のものですみません。 |
簡単に言うと、HTTP proxy とは 1. proxy サーバが localhost:8080 を listen する。 2. ブラウザの proxy の設定を localhost:8080 にする。 3. ブラウザが http://X68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi を読むとき、 GET http://X68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi HTTP/1.0 Host: X68000.startshop.co.jp User-Agent: .... というリクエストを proxy 宛に送る。 4. proxy は X68000.startshop.co.jp:80 に接続し、 GET /~68user/cgi-bin/wwwboard.cgi HTTP/1.0 Host: X68000.startshop.co.jp User-Agent: .... というリクエストを送る。 5. X68000.startshop.co.jp から (proxy に) 返事が返ってきたら、 そのままブラウザに渡す。 を行うプログラムです。とりあえず GET を中継できるように してみて下さい。 |
つるです。 早速のお返事ありがとうございます。 仕組みはだいたいわかるのですが 実際に作ってみるとなると・・・。 ネットワークプログラム初心者には かなりキツイです。 |
> 仕組みはだいたいわかるのですが こう言っちゃなんですが、自分ではわかっているつもりでも、 わかっていないのでしょう。 クライアントからのデータを読まないと、proxy サーバが どこに接続したらよいかは判断できないのに、先に接続 しようとしていますし、 GET http://X68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi HTTP/1.0 を GET /~68user/cgi-bin/wwwboard.cgi HTTP/1.0 に変換する処理もやってません。 ちょっとずつ作ってみて下さい。 |
つるです。 すいません。 説明不足でした。 >クライアントからのデータを読まないと、proxy サーバが >どこに接続したらよいかは判断できないのに、先に接続 >しようとしていますし、 実は、接続先は固定です。(IPアドレス指定です。) 特定のコンテンツサーバに接続しようとしてます。 >GET /~68user/cgi-bin/wwwboard.cgi HTTP/1.0 >に変換する処理もやってません。 ブラウザからのリクエストは GET /~68user/cgi-bin/wwwboard.cgi HTTP/1.0 ・・・ のように来るようにしてます。 そして、そのリクエストを そのまま(操作無しで) 接続先Webサーバに転送しようとしていますので・・・。 すいません、説明不足で・・。 とりあえず、もうちょっとがんばってみます。 参考にするとよいページがあったら 教えてくださると幸いです。 ご迷惑をおかけします。 |
とりあえず 2〜3日悩んでみて下さい。それでも わからなかったらまた質問して下さい。 |
はじめまして。 Solarisのnfsで質問したいのですが。 .nfsAA5A (下4桁はユニークな番号に変化する) というファイルを見たことはありませんか? クライアントマシンからあるシェルを起動すると 勝手に出来てしまって、困っています。 サーバマシン上では出来ないのですが。 心当たりがあれば、なんでも良いので教えて下さい。 |
> .nfsAA5A 昔 消せなくて困りましたが、管理者に聞いたら NFS で トラブルがあった際、作成されるファイルだそうです。 しばらくすれば勝手に消えるとか。 ただし、本当かどうかは知りませんし、どういうトラブルが あったら作成されるのかも知りません。 |
もし FreeBSD と Solaris のNFS まわりのコードがある 程度同じなら (元は同じはずですよね)、 http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/sys/nfs/nfs_vnops.c?rev=1.150 /* * Silly rename. To make the NFS filesystem that is stateless look a little * more like the "ufs" a remove of an active vnode is translated to a rename * to a funny looking filename that is removed by nfs_inactive on the * nfsnode. There is the potential for another process on a different client * to create the same funny name between the nfs_lookitup() fails and the * nfs_rename() completes, but... */ static int nfs_sillyrename(dvp, vp, cnp) ... あたりのようです。 |
ありがとうございます。 現在、NFS & NIS の設定がうまくいってないそう なので、その辺の影響かな? まずは、ちゃんと設定するようがんばります。(^^; |
いつも拝見させていただいてます 今c言語でcgiのプログラム書いてるんですが hoge.exe?data1=aa&data2=bb みたいに引数を渡してプログラムを直接呼びたいのですが、うまくデータが渡せません Formからだと正常に動作するんですがサーバーの設定が関係しているんでしょうか サーバーはwindows nt + iisです apachだとそのような事はないですか? |
> hoge.exe?data1=aa&data2=bb 情報が不足していますので、わかりません。 「FORM からだと正常に動作する」というのは、どういう ふうに呼び出しているんですか? 「引数を渡してプログラムを 直接呼びたいのですが」とはどういうふうに呼び出そうと しているんですか? |
いつも勉強させていただいてます。あたしもがんばります。 |
大江山と言う童謡か歌の歌詞知りませんか? |
スミマセンでした... hoge.exeは日付等を受け取りlogを集計して返すプログラムです まず送信フォームのhtmlはこんな感じです < form method=post action="cgi-bin/hoge.exe" > < select name="data1" size="1" > < option selected value="aa"> aa < /option > < option value="bb" > bb< /option > < /select > < INPUT TYPE="SUBMIT" VALUE="送信" > < /form > これを < A HREF=hoge.exe?data1=cc&data2=dd > hoge < /a > のようにリンクから呼んで決まった処理をさせたいんですけどうまくいきません お手数ですが情報お持ちでしょうか |
またスミマセン.... <>の書き方を間違えてしまいました |
FORM は POST で送っているわけですね? で、 > <A HREF=hoge.exe?data1=cc&data2=dd> hoge </a> だと GET になるわけです。hoge.exe は POST でデータを 受けているので、標準入力を読んでいるはずですよね。 もしGET にも対応したいなら環境変数 QUERY_STRING を 見るようにしないといけません。 C なら getenv("QUERY_STRING") でもいいし、 main(int argc,char *argv,char *envp) として envp を見てもよいでしょう。 |
ありがとうございます if(0 == strcmp("POST",getenv("REQUEST_METHOD"))) { /* POSTの場合 */ if(fgets(buf, len+1, stdin) == NULL) { return 1; } } else { /* GETの場合 */ strncpy(buf, getenv("QUERY_STRING"), sizeo(buf)-1); } こんな感じでうまくいきました POST と GET ぜんぜん意識してませんでした(よく調べます) ほんとにありがとうございます。 |
promptの説明文の中にHTMLタグが表示されてましたよ % set prompt="%Sabc%s%Bdef%b%Ughi%u:" abc<b>def</b><u>ghi</u>: |
お久しぶりです、以前くだらない質問ばかりしていたものです(^^; CGIでサーバーの負荷率を調べたいのですが何かよい方法は無いでしょうか? 一応 top の表示のヘッダー部分に表示される数値を取り出し加工しようと もくろんだのですが見事に失敗しました。 open(SYS, "top|"); やはり甘かった。コマンドラインで top > hoge.txt としても取れないので top から取り込むのは駄目みたいですね。 オプションにもそれらしいものが見つかりませんでした。 FreeBSDの日本語マニュアルを見る限りはどうも互換性なさそうです。 面倒なんで試していませんが、一定の処理にかかった時間を測定して 負荷を調べようかと思うのですが・・・ これもいまいち正確さに欠けそうだし。何よりめんどうだし(^^; あっ因みにそれほどの正確さは求めていません、そもそもそんなに正確に 数値を取れないと思ってますから。 何か方法を知っていましたら、よろしくお願いします。 OSはVineLinuxです。 |
> promptの説明文の中にHTMLタグが表示されてましたよ どうもです。直しておきます。 # 実は気づいていたんだけど、自作の変換フィルタをどう # 直せばよいのかわからくて悩んでいるところです。 > CGIでサーバーの負荷率 load average を求めたいなら uptime や rup localhost などが使えると思います。 > open(SYS, "top|"); 入力に tty を読んでるのなら、top < /dev/null で いけるかもしれません (ダメかも)。 なお load average は、違うマシンや OS と比較は意味が ありません。わかっておられるかもしれませんが、念のため。 |
uptimeの情報ありがとうございます。 なるほどこれなら何とかなりそうです。 手持ちのコマンドリファレンスには uptime のことが載っていません でしたが、man には掲載されていたので、これでうまくいきそうです。 /usr/bin/ や /usr/local/bin/ にあるコマンドを一つづつ調べるのも あまりの数に手を焼いていたところなので助かりました。 >入力に tty を読んでるのなら、top < /dev/null で やってみましたが駄目でした。 >なお load average は、違うマシンや OS と比較は意味が >ありません。わかっておられるかもしれませんが、念のため。 すいません、意味がよくわからないのですが、「この結果を元に ほかのサーバーと比較するには意味が無い」と言う意味でしょうか。 単純に、マシンの反応が遅い時の原因が、回線の影響かサーバーの負荷 かを調べる用途に使うつもりです。 ありがとうございました。 |
> 「この結果を元にほかのサーバーと比較するには意味が無い」 そうです。「Pentium133+FreeBSD と Pentium166+FreeBSD」とか、 「Pentium133+FreeBSD と Pentium133+Linux」などの load average を 比較するのは意味がないです。また、load average が2倍だから と言って、負荷が2倍とか速度が1/2 ということもない、という 意図で書きました。 > 単純に、マシンの反応が遅い時の原因が、回線の影響かサーバーの負荷 > かを調べる用途に使うつもりです。 ということであれば、load average でいいと思います。 > /usr/bin/ や /usr/local/bin/ にあるコマンドを一つづつ調べるのも > あまりの数に手を焼いていたところなので助かりました。 `load average' というキーワードを知っていれば、 % strings -f /usr/bin/* | grep -i 'load average' などとするのも一つの手ですね。 |
この間示唆して頂いた、マルチスレッドの関連文書を調べる長旅に出た ところ、68userさんのところにあるではないですか(echo関連)。灯台下 暗し・・・ 御恥ずかしい。 ただ、以下のようなメッセージが出たので、どうも僕の環境(後述)では 不可能みたいです。 The Unsupported function fork function is unimplemented at echo.pl line 36. 因みにperl -vの結果は以下の通りです。 version 5.005_03 built for MSWin32-x86-object 目的がテキスト変換なので、delegateみたいな形式(/-_-)で対応しようかな、 それともjavaでも使ってみようかな、それともPCにUnixをインストールしよう かな、と悩んでいるところです(なんかどれも実行しなさそうですが)。 |
> どうも僕の環境(後述)では不可能みたいです。 Windows では fork は使えませんので、select を使うしか ないですね。 IO::Socket と IO::Select を使って http://X68000.startshop.co.jp/~68user/tmp/bogus-proxy.pl こんな感じでしょうか。本当に実用段階まで持ってくには まだまだ機能追加、バグ取りをしなきゃいけませんが。 ポイントは、全てのソケットからのデータを select 経由で 受け取ること。今はそうなってませんので、1つのソケット からのデータが遅れると、そこがボトルネックになってしまいます。 |
> Windows では fork は使えませんので cygwinに入っているPerlはforkが使えるそうです。(試していません。) http://sourceware.cygnus.com/cygwin/ |
68user様; どうも御教授、ありがとうございます。 現在、示して頂いたスクリプトを理解しようと勉強しています。しかし、 理解した上で改造するまでに、ちょっと時間がかかりそうなので(※)、 先にお礼を申し上げます。 ※ ->とか、selectとかの概念がまだ無いので、アルゴリズムがまだ 理解できずに停止しています。 また、進捗があったら、ご報告します。本当にありがとうございます。 # http://X68000.startshop.co.jp/~68user/tmp/bogus-proxy.pl は、 # ひょっとして、僕の質問のために作って頂いたものですか? # だとしたら、大感激です! ←違っていたらすいません。 Yuuki様; どうも貴重な情報、ありがとうございます。 早速ダウンロードして、68userさんのecho.plを実行したら、とりあえずforkは するみたいなのですが、残念なことに、forkしたとたんに、子プロセスが一般保護 違反を起こしてしまう(kernel32.dll)みたいです。多分、僕の環境が一般的じゃ ないので、それが原因じゃないかな、と思っています。現在、解析中です(←時間 がかかりそうですが・・・)。 因みにcygwin32はB20(full.exeのほう)です。perl -vは以下の通りです。 This is perl, version 5.005_62 built for cygwin 折角情報を頂いたのに、生かせなくって、申し訳ないです。 |
> selectとかの概念がまだ無いのでアルゴリズムがまだ > 理解できずに停止しています。 考え方は http://X68000.startshop.co.jp/~68user/net/echo-4.html と 同じです。モジュールを使うことで、ちょっとだけすっきりと書けます。 ここらへんは、そのうち web で解説を書くつもりです。 > ひょっとして、僕の質問のために作って頂いたものですか? 自分で使おうと思って、たまたま作ってました :-) 一応、GET だけはできるレベルのものを置いておきます。 http://X68000.startshop.co.jp/~68user/tmp/1st-proxy.pl shutdown あたりが とてもあやしい。 > cygwinに入っているPerlはforkが使えるそうです。 あ、そうなんですか。Windows 環境で perl を動かした ことがないので、適当に書いてしまいました。 |
http proxy は結構難しいですね。シグナルが飛んできたり、 コネクションを切断できなかったり、ファイルディスクリプタが 解放されなかったり…といったバグに苦しみながらも、3日かかって やっと書き上げました (でも HTTP/1.1 には未対応)。 # perl が panic で落ちるのを初めて見た。 でも、ネットワークプログラミングに関する理解力を試すには、 絶好の例題かと思いますので、ぜひチャレンジしてみて下さい。 # というわけで、完成版は出しません :-) |