• ベストアンサー

IO::Socket::INET で tcp が Bad protocol

Perl 5.6.1 on Debian linux です。 LDAP+Sambaでsmbldap-toolsを使おうとしています。 が、その中のPerlスクリプトで IO::Socket::INET: Bad protocol 'tcp' というエラーが発生しています。tcp が Bad protocol な ことなんてあるんでしょうか?あるいは別に必要な モジュールあるいはパッケージがあるんでしょうか? よろしくお願いします。

  • Perl
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

IO/Socket/INET.pmを見てみると、getprotobyname()が値を返さないとダメみたいです。 perl -e 'print join(":",getprotobyname( "tcp" ))' ――の結果を確認されてみては。

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/getprotoent.3.html
tao_0077
質問者

お礼

失礼しました。Google検索で自己解決してしまいました。 nsswitch.conf 内の protocols が LDAP を参照するようになっていました。デフォルトのまま使ってたんですが、その後に files があるので大丈夫と思ってしまいました。 ともあれ、ありがとうございました。

関連するQ&A

  • perlのAF_INET、PF_INETとは

    Perlでsocketを使う場合 socket( SOCK, AF_INET, SOCK_STREAM, getprotobyname('tcp')); のように書きますが人のスクリプトを見ると「AF_INET」だったり 「PF_INET」だったりします。これはどちらが正しいのでしょうか?

    • ベストアンサー
    • CGI
  • PerlでIO::Socket::INET: connect: Unknown errorについて プロキシ設定?

    PerlでIO::Socket::INET: connect: Unknown errorが発生します。IEを使う時でもインターネットに接続する場合、プロパティで192.168.1.1を設定しておりますが、 プロシキ接続できる、設定方法はあるのでしょうか?

    • ベストアンサー
    • Perl
  • Socketモジュール互換の plライブラリ?

    ニフティでメール送信を行いたいのですが、sendmailが使えないので、最悪SMTPのプロトコルでPerlを使って通信をしたいのですが、ニフティではモジュールも使えないので、困っています。デコードメールは、制限が多く使いたくありません。Socketモジュール互換のライブラリなどあるのでしょうか? あと@niftyではPHPは使えるのでしょうか?

    • ベストアンサー
    • CGI
  • PerlでHTML取得(その前にSocket取得)できない原因について

    下記コードを使い WEBサイトの更新日付を取得したいのですが 実行すると Socket Error:Invalid argument のエラーが表示されソケットの作成に失敗します。 Perlのバージョンは 5.8.0でウィルス対策ソフト停止後のコード実行等対策等を考えて行いましたが状況は改善されません。 よければ、どうしてソケットの作成に失敗するのか教えていただけないでしょうか? 失敗テストケース $host:www.google.co.jp # テストコード # モジュールの使用宣言 use IO::Socket; # URLを入力 $ur1 = <STDIN>; # URLをホスト名とファイルパスに分割 chomp($ur1); if ($ur1 =~ /http:\/\/([^\/]+)(\/.*)/) { $host = $1; $file = $2; } else { die "そのURLには対応していません。\n"; } # ソケットオブジェクト作成 $client_socket = new IO::Socket::INET { PeerAddr => $host, PeerPort => 'http', Proto => 'tcp', TimeOut => '5' }; unless ($client_socket) { print "Socket Error:$!\n"; } # 入力をサーバーに送信 print "$host $file" . "\n"; print $client_socket "GET $file HTTP/1.0\n\n";

    • ベストアンサー
    • Perl
  • perl Socketで文字化け

    お世話になります。 早速ですが、以下のスクリプトをWinXPHomeSP2+ActivePerl5.6.1の環境で実行しました。訳あって標準モジュールのみ使用しております。 #!/usr/local/bin/perl use Socket; use FileHandle; # デフォルトホストの設定 $host = 'jws.jalan.net'; $port = getservbyname('http', 'tcp'); $path = '/APICommon/OnsenSearch/V1/?key=and10fed2591c0&l_area=430400&xml_ptn=1'; #$path = 'APICommon/OnsenSearch/V1/?key=and10fed2591c0&l_area=430400&onsen_q=4&xml_ptn=1'; $ip = inet_aton($host) || die "host($host) not found.\n"; $sockaddr = pack_sockaddr_in($port, $ip); socket(SOCKET, PF_INET, SOCK_STREAM, 0); connect(SOCKET, $sockaddr); autoflush SOCKET (1); print SOCKET "GET $path HTTP/1.1\nHost: $host\nConnection: close\n\n"; # HTTP応答を受信 while (<SOCKET>) { print "$_"; } # 終了処理 close(SOCKET); exit; 長くて恐縮です m(__)m このスクリプトを実行するとUTF8形式のXMLが出力されますが、なぜかその中の”弱アルカリ性低張性泉”という文字だけが文字化けしてしまいます。 ところがIE6やFireFox2などのブラウザで http://jws.jalan.net/APICommon/OnsenSearch/V1/?key=and10fed2591c0&l_area=430400&xml_ptn=1 に直接アクセスすると、文字化けせずに表示されます。 従ってPerlの実装が悪いのかと思ったのですが、上記スクリプト8行目付近の#$pathのコメントをはずして実行すると(クエリストリングにonsen_q=4が追加され、出力内容が絞り込まれます)、文字化けが発生するレコードが出力されるにも関わらず文字化けしません。 というわけで、問題箇所が切り分けられず、途方にくれております。対処方法などご教授いただければ幸いです。

    • ベストアンサー
    • 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
  • Perl LWPでのIPv6エラー

    Perl LWPでのIPv6接続がエラーでつながらず、原因がわかりません。 記載しているソースで、Localhostに接続すると、LWP::UserAgentはエラーとなりますが HTTP::Tiny、wgetコマンドは、問題ありません。(IPv4の場合は、LWPも問題ありません)。 どなたか、よい解決へのお知恵をよろしくお願いします。 perl 5.16.1 CentOS 5.9 ------ソース----- #!/usr/bin/perl use strict; use Net::INET6Glue; my $uri = 'http://[::1]'; use LWP::UserAgent; my $ua = LWP::UserAgent->new; my $res = $ua->get($uri); print $res->content,"\n"; print "********************************\n"; use HTTP::Tiny; my $http = HTTP::Tiny->new; my $response = $http->get($uri); print $response->{content}, "\n"; -----結果----- Can't connect to ::1:80 (接続を拒否されました) LWP::Protocol::http::Socket: connect: 接続を拒否されました at /usr/local/perl-5.16.2/lib/site_perl/5.16.2/LWP/Protocol/http.pm line 51. ******************************** <html><body><h1>It works!</h1></body></html> ---環境--- This is perl 5, version 16, subversion 2 (v5.16.2) built for x86_64-linux cpan[1]> i /INET6/ Reading '/root/.cpan/Metadata' Database was generated on Fri, 01 Mar 2013 03:17:03 GMT Distribution SHLOMIF/IO-Socket-INET6-2.69.tar.gz Distribution SULLR/Net-INET6Glue-0.5.tar.gz Module = IO::Socket::INET6 (SHLOMIF/IO-Socket-INET6-2.69.tar.gz) Module = Net::INET6Glue (SULLR/Net-INET6Glue-0.5.tar.gz) Module = Net::INET6Glue::FTP (SULLR/Net-INET6Glue-0.5.tar.gz) Module = Net::INET6Glue::INET_is_INET6 (SULLR/Net-INET6Glue-0.5.tar.gz) Module < Net::Patricia::AF_INET6 (PHILIPP/Net-Patricia-1.19.tar.gz) Module < Net::Whois::Object::Inet6Num (AASSAD/Net-Whois-RIPE-2.002.tar.gz) 8 items found

    • ベストアンサー
    • Perl
  • socket使用時の環境変数(REMOTE_ADDR)について

    色々調べても結局わかりませんでしたので もしお分かりになる方がいらっしゃれば 教えて頂ければ幸いです。 socketを使用するAというプログラムを作ったのですが、 そのプログラムからBというプログラムを呼び出した時、 Aに取得されるREMOTE_ADDRは、私のREMOTE_ADDRになるのですが、 Bに取得されるREMOTE_ADDRは、サーバのREMOTE_ADDRになってしまいます。 Bに対しても私のREMOTE_ADDRを取得させたいのですが、 方法はありますでしょうか? 具体的なSOCKET使用機構は以下のようになっております。 use IO::Socket qw(:DEFAULT :crlf); $/ = CRLF . CRLF; my $data; my ($host,$path) = $url =~m!^http://([^/]+)(/[^\#]*)!; my $socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => 'http(80)', Proto => 'tcp'); select($socket); $|= 1; select (STDOUT); print $socket "POST $path HTTP/1.0",CRLF,CRLF; close($socket); どうぞ宜しくお願い致します。

    • ベストアンサー
    • Perl
  • カーネルのプロトコルスタック開発

    カーネル初心者です。 カーネルに実装されているTCP/IPプロトコルスタックを開発・デバッグしたいのですが、まったく手順が分かっておりません。。 カーネルの構築方法は分かるのですが、下記に示すように実装されている個々のプロトコルを開発・デバッグしてから、カーネルに組み込みたいと考えています。 1.TCP/IPプロトコルを開発・デバッグ 2.上記モジュールをカーネルに組み込みデバッグ #それともそもそもこんな手順でやらない? したがって、カーネル実装のプロトコルスタックについて、以下の2点をどなたかご教授いただけないでしょうか。 ・開発環境の作り方 ・デバッグの方法 開発のサンプルや参考ページもあわせて教えていただけると幸いです。(自力で探すことができませんでした。。) 英語サイトでも大丈夫です。 現在考えているのはLinuxかBSD系のOSですが、種類は問いません。 どうかよろしくお願いいたします。

  • C言語でTCPの3way handshake

    (C言語)Linuxのpacket socket(socket(AF?PACKET, SOCK_DGRAM, htons(ETH_P_IP))) を使ってTCPの3way handshakeをOSのプロトコルスタックに頼らず自力で挑戦しています。 RFCやほかの技術本をよんでIPヘッダやTCPヘッダの実装は一応できたのですが、肝心のsynパケットを送った後のackパケットが返ってきません。 wiresharkでは問題なくsynパケットと認識できているのですが、きっとどこかに不備があるはずです。 そこでC, C++ Javaでもいいのでこのプログラムの実装例が載っているサイトなどを教えてください。(英語でもかまいません)

専門家に質問してみよう