Perlのソケット接続での利用法について

このQ&Aのポイント
  • Perlのソケット接続での利用法について質問しています。現在、connect関数を使用して接続先に接続しているのですが、接続が失敗した場合に別の接続先に接続する方法を知りたいです。
  • また、接続が失敗した場合にdie関数ではなく、別の接続先に接続する方法を模索しています。試しにconnect関数を連続して使用する方法を試してみましたが、うまく動作しませんでした。
  • この書き方はどこがまずかったのでしょうか。また、接続が失敗した場合に別の接続先に接続させるためにはどのような書き方をすれば良いのでしょうか。Perl初心者ですので、わかりやすく教えていただけると助かります。
回答を見る
  • ベストアンサー

Perlのorのソケット接続での利用法について

一般的なソケットの接続は次のような書き方になっていると思いますが、connectでundefが帰って来た時にdieではなく、別の接続先に接続するような書き方を探っています。 connect(ファイルハンドル, 接続先) || die; 上記のコードを次のように書き換えてみましたが、接続先1で失敗した場合、接続先2に接続されるかと思いきや、そのままdieしてしまいます。 connect(ファイルハンドル, 接続先1) || connect(ファイルハンドル, 接続先2) || die; この書き方はどこがまずかったのでしょうか。 また、想定通りに動作させるにはどのように書いたら良いのでしょうか。 Perl初心者で大変恐縮ですが、何卒宜しくお願い致します。

  • inshin
  • お礼率78% (104/133)
  • Perl
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

connect() || connect() || die という書き方が良いかはともかく、 少なくとも2つ目の接続が成功すればdieはしないと思います。 use strict; use warnings; use Socket; my $host1 = 'localhost'; my $port1 = '1234'; my $iaddr1 = inet_aton($host1); my $sock_addr1 = pack_sockaddr_in( $port1, $iaddr1 ); my $host2 = 'localhost'; my $port2 = '80'; my $iaddr2 = inet_aton($host2); my $sock_addr2 = pack_sockaddr_in( $port2, $iaddr2 ); socket( my $sock, PF_INET, SOCK_STREAM, 0 ) || die "$!"; connect( $sock, $sock_addr1 ) || connect( $sock, $sock_addr2 ) || die "$!"; close($sock);

inshin
質問者

お礼

ご回答いただき、ありがとうございます。 その後、何度か試してみましたが、5.12.4 built for darwin-thread-multi-2levelのPerlではいくら試しても同じ結果となり、5.8.8のLinuxで動いているPerlでは想定通りの動きになりました。 何でしょうね、この動きの違い… バグ…?

その他の回答 (1)

回答No.2

一つ目のconnectでソケットが汚れた状態になる? ソケットを2つ用意(以下の例だとsock1とsock2)して、それぞれconnectに渡すといい(かもしれない) connect( $sock1, $sock_addr1 ) || connect( $sock2, $sock_addr2 ) || die "$!";

関連するQ&A

  • Perlのソケット接続のタイムアウト

    Perlのソケット接続、connectで接続に失敗した時にdieではなく、別の接続先に接続するよう、次のように書きました。 connect(ファイルハンドル, 接続先1) || connect(ファイルハンドル, 接続先2) || die; 上記のコードではundefが帰って来た時にしか次の接続先に接続せず、例えばサーバーが応答せず、パケットをドロップしているような場合だと接続先1への接続でプログラムがハングアップしたような状態になります。 それぞれのconnectにタイムアウト時間を設けたいのですが、どのようにしたらよろしいのでしょうか。 また、ソケット接続にタイムアウトを設定できるモジュールがありましたらそちらを利用したいと思います。 Perl初心者で大変恐縮ですが、何卒宜しくお願い致します。

    • ベストアンサー
    • Perl
  • PerlでSocketを閉じずに再利用する方法

    インターネット上の情報を参考に作成したCGIでPerlのソケットを用いて通信を行っておりますが、CGIが呼び出されるたびに以下のような動作を行っております。 ソケット生成 -> ソケット接続 -> HTTP通信 -> ソケット切断 このうち、ソケットの接続におおよそ200ミリ秒ほどかかり、このレイテンシを減らすため、ソケットはCGIが呼び出されるたびに生成、接続するのではなく、最初からセッションを張った状態で、CGIが呼び出されるとHTTP通信部分のみを行うようにすることはできますでしょうか。 現在試したこととして、1回目の呼び出しでソケットをクローズせずに処理を終了し、2回目でソケットの生成、接続をせずに直接HTTP通信をしようとしてもうまくいきませんでした。 Perl、ネットワークプログラミング初心者なもので恐縮ですが、何卒よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • perl >> DBI >> DBD >> oracle8でエラー

    perlからDBI経由でoracleに接続したいのですが、 なぜか DBI->connectのところで失敗して下記のようなエラーが出ます。 `CONNECT ERROR ORA-1034: ORACLE not available oas userでtelnetで入り、直接perl scriptを起動すると問題なく動作するの ですが、なぜかOAS経由でブラウザーからCGIとしてcallすると 失敗するのです。 もう2日も悩んでます。 どなたか原因がわかりましたらご教授ください。 ---- 環境 --- perl 5.005_03 OAS 4.0.8.1 DBI 1.30 DBD-Oracle 1.12 OS solaris2.6 接続先DBは別のsolarisマシンに入ってる。 ----------------ソース----------------------------- #!/usr/local/bin/perl use DBI; $dsn = 'DBI:Oracle:orcl'; $user = 'testuser'; $password = 'testuserpass'; $dbh = DBI->connect($dsn, $user, $password) or die "接続できません"; my $sth = $dbh->prepare("select * from munec"); $sth->execute; while(@row = $sth->fetchrow_array) { print "@row\n"; } ---------------

  • perlのソケット通信について

    perlのソケット通信でwebブラウザーのようなものを製作中なのです。 http://tohoho.wakusei.ne.jp/wwwperl2.htm#socketを参考にしたのですが、 yahooは表示されますが、xrea系のサイトのような特定のサイトが閲覧できず(どちらかというと特定のサイトのみ閲覧できる)、NotFoundかDNSエラーになります。 とほほのWWW入門のサンプルの他に追加する項目などはあるのでしょうか?よろしくお願いします。 現在の構文は以下の通りです browser.cgi 改行コードLF、漢字コードEUC ------------- #! /usr/bin/perl print "Content-type:text/html\n\n"; $addr = (gethostbyname("www.xrea.com"))[4]; $name = pack("S n a4 x8", 2, 80, $addr); socket(S, 2, 1, 0); connect(S, $name); binmode(S); select(S); $| = 1; select(stdout); print S "GET /index.php HTTP/1.0\n\n"; while (<S>) { print; } close(S);

    • ベストアンサー
    • Perl
  • perlのソケットがうまく作動しません。

    sakuraインターネットサービスでドメインを取得して、通常はそこでサービスを使っているのですが、このページの情報を、自分の持っているもうひとつのホームページ(プロバイダによって与えられたもの)上でも、データを引っ張り出して同じ情報を使いたいと思っているのですがうまくいきません。 どのようにしたらうまくいくものでしょうか? ご教授、宜しくお願い致します。 #!/usr/local/bin/perl $host = "domain.com"; $file = ""; use IO::Socket; print "Content-type: text/html\n\n"; $file = "/"."$file"; $remote = IO::Socket::INET->new( Proto => "tcp", PeerAddr => "$host", PeerPort => "host(80)", ); unless ($remote){die "cannnot connect to help daemon on $host";} $remote->autoflush(1); print $remote "GET $file HTTP/1.0\n\n"; while(<$remote>){ print "$_"; }

    • ベストアンサー
    • Perl
  • perlからmysqlに接続できない

    #! c:/perl/bin/perl  use DBI; $user = 'root'; $passwd = 'パスワード'; $db = DBI->connect('DBI:mysql:db1:localhost', $user, $passwd); $sth = $db->prepare("INSERT INTO bunrui VALUES (1,'1st','memo')"); $sth->execute; $sth->finish; $db->disconnect; perlからmysql二接続するためDBIをインストールして、上のようなサンプルコードを実行してみたのですが Internal Server Error になってしまいます。どこかコードが違っているのでしょうか?

    • ベストアンサー
    • Perl
  • Perl 教えてください。

    下記のような簡単なスクリプトなんですが、なぜかサーバーにアップすると動きません。 ローカルでコマンドプロンプトから直接実行するとまともに動作します。 パーミッションは「755」と「705」でやってみましたが。 perlのパスは合っていますし、実際同じ場所に置いた他のCGIは動作します。 #!/usr/bin/perl open (DT, "<./data/***/***.csv") or die "File '***.csv' Open Error."; @data = <DT>; $data[0] = ",,,,,,\n"; open (OUT,">./data/***/***1.csv") or die "File '***1.csv' Open Error."; print OUT @data; close (DT); close (OUT); 原因が分からず困っています。 解決策でなく、原因と思えるだけの回答で結構ですので何卒よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • PerlからDBの接続

    やまとです。こんにちは。 PerlからDBに接続しているのですが、うまく出来ません。 環境は OS : Windows2000、Perl : ActivePerl628、DB : Sybase11.0.3 DBI : DBI1.18、DBD : DBD_Sybase です。 DBDとDBIインストール後、DBに接続するとエラーが起こります。 エラーが起こる場所は(ソース抜粋記載) use DBI; (←ここは平気) $dbh=DBI->connect($database, $db_user, $db_password) or return 0;      (↑ここがエラー) 以上の箇所です。 もちろん、$database, $db_user, $db_passwordそれぞれの変数には 正しい値が入っています。 次にerror.logの内容ですが、 1つ目は、 Premature end of script headers: C:\・・・・・・・(←実行ファイル名) 2つ目は、 install_driver(Sybase) failed: DBD::Sybase initialize: cs_ctx_alloc() failed at C:/Perl/lib/DynaLoader.pm line 225. 3つ目は at ./test.cgi line 43 (←connectの場所) となっております。 色々調べてみましたが、分かりませんでした。 use DBI; は正常に動作していますので、DBDとDBIのインストールは正常に 出来ていると思うのですが・・・ 同じ経験、又は、このエラーに関して分かる方いらっしゃいましたら、 対処法、ご教授願いたいのですが。 宜しくお願いします。 #環境の情報など不足している部分がありましたら補足させて頂きます。

    • ベストアンサー
    • Perl
  • Perlにおけるレコードセパレータについて

    Perl初心者、現在独学中です。 複数プラットフォームで作られたテキストベースのデータファイル群を ファイルハンドルから開き readline で読み込む際、3つの改行文字の 全てに入力レコードセパレータ(特殊変数$/)を対応させたいのですが、 どのようにすれば良いのでしょうか。 ファイルサイズが大きいもので500~600MB程ありますので undef $/; で 全て読み込むのは余り現実的ではなく1行ずつ評価したいのです。 無理なようでしたら、代替案(ファイルの先頭64KBだけを読み込む等)を ご教示頂きたいと思います。

    • ベストアンサー
    • Perl
  • PerlからのCSV出力

    Perl初心者です。 PerlでOracleに接続し、結果をCSVを出力したいのですが 下記プログラムだとなにも出力されません。 Oracle10g OS:Linux *** #!/user/bin/perl # # # DBI モジュールの読み込み use DBI; #接続 my $hDb = DBI->connect("dbi:Oracle:dbname", "user/pass") or die "CONNECT ERROR $DBI::errstr"; #SELECT # $hSt = $hDb->prepare("SELECT ID,NAME FROM MASTER"); open(OUT, ">data.dat"); #実行 $nRes = $hSt->execute; #データの取得 while($raRes = $hSt->fetchrow_arrayref) { print OUT join(",", @$raRes), "\n"; } # ファイルクローズ close(OUT); $hSt->finish; $hDb->disconnect;

専門家に質問してみよう