top

TOP  RSS  Login

Perl - IO::Socket::INET

概要

インターネットソケットを扱うモジュール。IO::Socket を継承しており、IO::Socket は IO::Handle を継承しているため、読み書きを行うメソッドについては IO::Handle を参照のこと。

オプション

new() コンストラクタあるいは configure() にて渡すことのできるオプション。

PeerAddr
接続するホストのアドレス。単に "localhost" とホスト名を指定する以外にもポートを指定し "localhost:9999" の形式で渡せる。
PeerHost
PeerAddr と同様。
PeerPort
接続するポート、あるいはサービス名。"http", "http(80)" あるいは単にポート番号だけの "80" の形式で渡す。
LocalAddr
バインドするアドレス。"localhost" あるいはポートを指定し "localhost:9999" の形式で渡す。
LocalHost
LocalAddr と同様。
LocalPort
バインドするポート。PeerPort と同様にサービス名、サービス名とポート番号の併記、ポート番号のみの形式で渡す。
Proto
プロトコル名、あるいはプロトコル番号。"tcp" や "udp" として渡す。
Type
ソケットタイプ。SOCK_STREAM や SOCK_DGRAM として渡す。
Listen
接続待ちのキューサイズ。
ReuseAddr
bind を行う前に SO_REUSEADDR を設定する。
Reuse
ReuseAddr と同じ。これは非推奨であって、ReuseAddr を用いるべきである。
ReusePort
bind を行う前に SO_REUSEPORT を設定する。
Broadcast
bind を行う前に SO_BROADCAST を設定する。ブロードキャストパケットを送る際に必要。
Timeout
様々な処理のタイムアウトの秒数を指定する。
MultiHomed
Try all addresses for multi-homed hosts
Blocking
ブロッキングモードで接続を行うか否か。デフォルトでは 1 が設定され、ブロッキングモードとなる。

TCP

クライアント

my $c = IO::Socket::INET->new(
  PeerAddr => "localhost",
  PeerPort => 9999,
  Proto    => "tcp"
) or die $!;
# 単に new("localhost:9999") でも良い
# デフォルトで TCP がプロトコルとして用いられる

$c->print("hello\n");
print $c->getline;

$c->close;

サーバ

my $s = IO::Socket::INET->new(
  LocalAddr => "localhost",
  LocalPort => 9999,
  Proto     => "tcp",
  Listen    => 10,
  ReuseAddr => 1
) or die $!;
# Proto や Listen, ReuseAddr は渡さなくても良い
# Listen : bind() に渡される接続待ちキューの最大数
# ReuseAddr : setsockopt( SO_REUSEADDR, 1) と同じ

$s->listen or die $!;

while(my $c = $s->accept){
  my $q = $c->getline;
  print $q;
  $c->print("hello\n");
  $c->close;
}

$s->close;

UDP

クライアント

my $c = IO::Socket::INET->new(
  PeerAddr => "localhost",
  PeerPort => 9999,
  Proto    => "udp"
) or die $!;

$c->send("hello");
$c->close;

ブロードキャストクライアント

my $c = IO::Socket::INET->new(
  PeerAddr  => "192.168.1.255",
  PeerPort  => 9999,
  Proto     => "udp",
  Broadcast => 1
) or die $!;

$c->send("hello");
$c->close;

サーバ

my $s = IO::Socket::INET->new(
  LocalAddr => "localhost",
  LocalPort => 9999,
  ReuseAddr => 1,
  Proto     => "udp"
) or die $!;

while(1){
  my $buf;
  my $ca = $s->recv($buf, 65535);
  my($port, $addr) = unpack_sockaddr_in($ca);
  my($ip, $host) = (inet_ntoa($addr), gethostbyaddr($addr, AF_INET));
  print "$buf from $host($ip):$port\n";
}

$s->close;

Last modified:2009/08/28 22:03:26

gKh

0.213665