• 締切済み

SocketでPOPサーバーから受けた情報をWhile文で受け取れない

SocketでPOP3サーバーにアクセスして、コマンドを 送った際の戻り値を変数に代入したいのですが、 下記の方法でうまくいきません。 While(<Socket>) { push(@test,$_); } print"@test"; telnetを使ってそのPOP3サーバーにアクセスすると 正常にアクセスしてログイン後メール内容を見る ことができます。While文がうまく動作していない みたいなのですが・・・。 ブラウザがずっとアクセスしてて画面が表示されません。 WinXP, Apache, Perl5.8.4 よろしくお願い致します。

みんなの回答

  • cojirou
  • ベストアンサー率50% (59/117)
回答No.3

もう見ていらっしゃらないかもしれませんが…。↓のURLは、 #1のURLのプログラムを参考にしたスクリプトです。 print S "USER $StrUsr\r\n"; print S "PASS $StrPsw\r\n"; の後に、 print <S> ."\n"; を付け加えると動きました。 しつこく失礼致しました。

参考URL:
http://www.kurumi.sakura.ne.jp/~kumicyou/Cnt/MemAll/ClnPop.html
全文を見る
すると、全ての回答が全文表示されます。
  • cojirou
  • ベストアンサー率50% (59/117)
回答No.2

再度失礼致します。 私はperlでPOP3クライアントを作ったことがないので、 見当違いの意見だったようですね。申し訳ありません。 ご質問文の内容だけでは他の可能性を考えるのが難しいので、 よろしければ、スクリプトの他の部分と現在の動作結果を お教えいただけませんか? 私の勉強のためのお願いに近いので、お時間がありましたらで構いません。 ちなみに当方では以下のURLにあるスクリプトは動作確認できました。

参考URL:
http://joe.ash.or.jp/pc/netprog/
全文を見る
すると、全ての回答が全文表示されます。
  • cojirou
  • ベストアンサー率50% (59/117)
回答No.1

以下のURLを見ると、while文のループの中にループを抜ける条件があるので、 もしかしたらソレが足りないなどでしょうか…。 他にも、「perl POP3 socket」で検索すると参考になりそうなサイトがありましたので ご参照ください。 ご参考までに。

参考URL:
http://x68000.q-e-d.net/~68user/net/pop3-2.html
jeti
質問者

お礼

ありがとうございます。そのサイトも見たのですが、条件を入れてもうまく動作しませんでした。 あきらめてPHPでやってみます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • pop3サーバーについて教えてください。

    sendmailのインストールされているLINUX9(REDHAT) で、popサーバーを使いたくってqpopperをインストールしたのですが、telnetでテストするとuserはOKになるのですが、passが通りません。 -ERR BAD login となります。 どこがいけないのでしょうか? どなたか教えていただけませんか? ./configure --enable-specialauth でコンパイルしてます。

  • POP3の認証ができません・・・。

    ネットワークの勉強をしています。クライアントとサーバーを作り、SMTPとPOP3の勉強をしています。Becky!というメールソフトでテスト用の自分のアカウントとPasswordを作って、サーバーでAPOPを設定し、クライアントのコマンドプロンプトからtelnetでサーバーにつなぎ、POPコマンドの"USER"(自分設定したアカウント)を入力しOKが出ます。その後"Pass"(自分で設定したPassword)を入力すると、エラーメッセージがでます。 原因はAPOPのセキュリティが働いて自分が登録したPasswordが暗号化されたからだと思います。 (ちなみに"APOP"コマンドでも同様のエラーです) APOPを設定したまま、telnetでPOP3の認証を行う事は出来ないのでしょうか?どなたか教えてください。

  • perl while pushで条件が無かったら0

    恐れ入ります。perlで、 push@list,$1 while $body=~s!<div>(.*?)</div>!!; として(.*?)部分を抜き出して@listを作成していますが、 <div>(.*?)</div>が存在しない、つまり条件に合致しない場合は0を代入したいのですが、どのようにすればよいでしょうか。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Socketによるデータ読み出しについての疑問

    horagaiです。お世話になっております。 socketを使ってWebサーバーからHTTPでファイルを取得するスクリプトを組んでいます。 (1) while(<SOCK>){ push(@Data,$_); } というルーチンでソケットハンドル<SOCK>から読み出したデータをリスト@Dataに入れています。 ここで読み出すのがテキストファイルなら、ファイルデータが終了した時点でちゃんとWhileループが終了するのですが、GIF,JPEGのようなバイナリーファイルの場合、あるいはテキストファイルでも一番最後の行に改行コードが入っていない場合、ループが終了してくれません。どうやってデータの終了を確認してwhileループを終了したら良いでしょうか。 (2) こうやって取得したファイルデータを print @Data ; で表示させると、各行の先頭に半角スペースが入ってしまいます。これはpushかsocketの仕様によるものでしょうか。それとも私がどこかでミスをやっているのでしょうか。 Perlのバージョンは 5.004_04 OSはLinuxです。よろしくお願いします。

  • サーバー(WinXP pro)にApacheとPHPを入れました。

    サーバー(WinXP pro)にApacheとPHPを入れました。 スクリプトを作成して、クライアントからTelnetで実行したいのですが、 Telnetでサーバにアクセスできません。 クライアントからTeratermを使用して接続を試みていますが、 ID・Passwordを聞かれます。 これは何を入れれば良いのでしょうか? 気付かずにどこかで設定しているのでしょうか? サーバーのアカウントにはパスワード設定をしていません。 [サーバー] OS:WinXp Pro Sp3 [クライアント] OS:WinXp Pro Sp3

  • 標準入力からのwhile文

    TERATERMをつかっていますが、しばらくアクセスしないと接続をきられてしまうホストがあるのですが、サーバの設定を変えずに手軽に抑止する方法はないでしょうか? 1分おきに何かを出力するようなコマンドを実行しようかと考えたのですが、 while文の書き方がcshとは違うみたいで、 $ while(1) > date > sleep 60 >end などとしても>から抜けてくれないのですが、どうしたらよいのでしょう。 また、根本的にこの方法では抑止できないよ、 などありましたら教えていただけると助かります。 よろしくお願いいたします。

  • perlでtelnetクライアント

    perlで、ソケットを使って、telnet(ポート23)クライアントを作ろうと思いました。 telnet接続すると、まず最初にサーバー側から"login: "とプロンプトが出力されるので、それを読もうとしたところ、プロンプトなので改行が来ないためか、待ち状態になりました。 while(<socket>) print $_; while(read(socket, $c, 1) print $c; の2パターン試しましたが、どちらも1文字も読めませんでした。 改行が来なくても、読込みができるテクニックはありますでしょうか。 perlのスキルは、他人のを参考にしないと作れない程度の素人同然です。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • SOCKETで入手したデータを抜き出したい

    他サーバのHTMLから部分的に抜き出したいと思っています。 他サーバのHTMLを表示する所までは出来たのですが、抜き出す所が出来ずに困っています。 私が抜き出そうと、表示のwhile文内を下記に変えた所、何も表示されなくなりました。  if( $_ =~ m/抜き出したい頭のキーワード/ ){ $flag = 1;}  if( $_ =~ m/表示したい尾のキーワード/ ){ $flag = 0;}  if( $flag eq 1){ print $_;} このwhile文内には変数に代入するとどうもNGのようです。 教えてGooの過去ログにも同様の質問があったのですが、 解決に至っていませんでした。ご教示願います。 ↓現在のソースコード ---------------------------- #!/usr/local/bin/perl -w use strict; use Socket; # Socket モジュールを使う # 接続先ホスト名 my $host = 'www.xxxx.co.jp'; # HTTP プロトコルを使う my $port = getservbyname('http', 'tcp'); # ホスト名を、IP アドレスの構造体に変換 my $iaddr = inet_aton($host) or die "$host は存在しないホストです。\n"; # ポート番号と IP アドレスを構造体に変換 my $sock_addr = pack_sockaddr_in($port, $iaddr); # ソケット生成 socket(SOCKET, PF_INET, SOCK_STREAM, 0) or die "ソケットを生成できません。\n"; # 指定のホストの指定のポートに接続 connect(SOCKET, $sock_addr) or die "$host のポート $portに接続できません。\n"; # ファイルハンドル SOCKET をバッファリングしない select(SOCKET); $|=1; select(STDOUT); # WWW サーバに HTTP リクエストを送る print SOCKET "GET /index.html HTTP/1.0\r\n"; print SOCKET "\r\n"; # ヘッダ部分を受け取る while (<SOCKET>){ # 改行のみの行ならループを抜ける m/^\r\n$/ and last; } # ボディ部分を受け取り、表示 while (<SOCKET>){ print $_; }

    • ベストアンサー
    • Perl
  • IO-Socketで…

    最初に開かれた1つのソケットで、 サーバーから不定期に送られてくるデータを処理→表示しつつ、 ユーザーから入力があった場合にそのソケットへ送信するといったメッセンジャーを作ろうと思っているのですが、「入力待ちと受信待ちを同時に進める」という事がどうも上手くいってくれません… use threads;を使い、送信用・受信用と分けたのですが、やはりどちらか一方が止まってしまいます…。 どの様に書いたらよいのでしょうか… 何方かご教授下さい…。 use threads; use IO::Socket; ($test_socketを生成) sub send{ while($input = <STDIN>){ chomp($input); print $test_socket "$input"; } sub recv{ while(1){ if($receive = <$test_socket>){ print "$receive\n"; } } } my $sendthread = threads->new(\&send); $sendthread->join(); my $recvthread = threads->new(\&recv); $recvthread->join();

  • Webサーバ名を知りたい【linuxコマンド】

    linuxコマンドで、Webサーバ名を表示させるにはどうすれば良いでしょうか? 具体的には、あるサーバへtelnet接続して、何かコマンドを打って【Apache1.3】といった具合に表示させたいのですが、コマンドが解らず困っています。 申し訳ありませんが、どなたか御教授宜しくお願いします!

このQ&Aのポイント
  • 中学生が月経周期の不安定さとおりものの異常について相談しています。生理が終わった6日後に再び生理が来たそうです。初めて生理がきたのは2年前で、周期が不安定であるということは考えにくいとのことです。通常は4日続き、5日目はおりもの程度の量しか出血しないようです。
  • おりものの異常として、シャバシャバするような大量のおりものや、鼻水のような状態のおりものが出ることがあると述べています。原因は良く分からないとのことですが、ナプキンを変えるペースが遅いことから雑菌の繁殖が考えられるとも言及しています。
  • 初めての経験であり、継続するようであれば母親に相談する考えも示しています。詳しい情報が不足しているが、追記する用意がある旨を伝えています。相談者は不安であり、回答を求めています。
回答を見る