top

TOP  RSS  Login

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

bud

0.324165