Perl - ソケット
Perl >
IO::Socket 以下のモジュール(IO::Socket::INET など)を使わずに Socket モジュールしか使わない場合のソケット操作。ちゃんとエラーチェックはやった方がいいよ。
TCP
クライアント
use Socket; my($host, $port) = ("localhost", 9999); my $s; socket($s, AF_INET, SOCK_STREAM, getprotobyname("tcp")); connect($s, pack_sockaddr_in($port, inet_aton($host))); print $s "Hello\n"; print <$s>; close($s);
サーバ
use Socket; my $port = 9999; my $s; socket($s, AF_INET, SOCK_STREAM, getprotobyname("tcp")); bind($s, pack_sockaddr_in($port, inet_aton("0.0.0.0"))); listen($s, SOMAXCONN); while(my $addr = accept(my $c, $s)){ my($cport, $caddr) = unpack_sockaddr_in($addr); my($host, $ip) = (gethostbyaddr($caddr), inet_ntoa($caddr)); print "connected from $host($ip):$cport\n"; my $n = <$c>; $n =~ tr/\r\n//d; print "client says `$n'\n"; print $c "hi\n"; close($c); } close($s);
UDP
クライアント
use Socket; my($host, $port) = ("localhost", 9999); my $s; socket($s, AF_INET, SOCK_DGRAM, getprotobyname("udp")); send($s, "hello", 0, pack_sockaddr_in($port, inet_aton($host))); close($s);
ブロードキャストする場合
use Socket; my($host, $port) = ("192.168.1.255", 9999); my $s; socket($s, AF_INET, SOCK_DGRAM, getprotobyname("udp")); setsockopt($c, SOL_SOCKET, SO_BROADCAST, 1); # これが必要 send($s, "hello", 0, pack_sockaddr_in($port, inet_aton($host))); close($s);
サーバ
use Socket; my $port = 9999; my $s; socket($s, AF_INET, SOCK_DGRAM, getprotobyname("tcp")); bind($s, pack_sockaddr_in($port, inet_aton("0.0.0.0"))); while(my $addr = recv($s, $_, 65535, 0)){ my($cport, $caddr) = unpack_sockaddr_in($addr); my($host, $ip) = (gethostbyaddr($caddr), inet_ntoa($caddr)); print "received `$_'from $host($ip):$cport\n"; } close($s);
UNIX ドメインストリームソケット
基本的には TCP に類似。
クライアント
use Socket; my $name = "mysock"; my $s; socket($s, AF_UNIX, SOCK_STREAM, 0); connect($s, pack_sockaddr_un($name)); print $s "Hello\n"; print <$s>; close($s);
サーバ
use Socket; my $name = "mysock"; if(-f $name){ die "file `$name' is already used"; } my $s; socket($s, AF_UNIX, SOCK_STREAM, 0); bind($s, pack_sockaddr_un("mysock")); listen($s, SOMAXCONN); while(my $addr = accept(my $c, $s)){ print "connected\n"; my $n = <$c>; $n =~ tr/\r\n//d; print "client says `$n'\n"; print $c "hi\n"; close($c); } close($s); unlink($name);
Last modified:2009/08/30 01:15:27
rW
0.345832