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
csU
0.45498