perl Socket编程实例代码

2019-10-01 14:23:58王旭


     if($pid == 0) {
          my $peer = gethostbyaddr($session->peeraddr,AF_INET) || $session->peerhost;
          my $port = $session->peerport;
          warn "Connection from [$peer,$port]n";
          $session->autoflush(1);
          print $session (my $s = localtime), "n";
          warn "Connection from [$peer,$port] finishedn";
          close $session;
          exit 0;
      }else {
          print "Forking child $pidn";
      }
}
close $sock;

现在再介绍使用Socket及IO::Socket模块来进行Unix domain Socket的client/server开发。Unix Domain Socket(简称unix socket)和TCP/UDP等INET类型socket相比起来有几个优点:
1)、安全性高,unix socket只在单机环境中使用,不支持机器之间通信
2)、效率高,执行时的速度约是TCP的两倍,多用于操作系统内部通信(IPC)
3)、支持SOCK_DGRAM,但和UDP不同,前后消息是严格有序的

因此使用Unix socket来设计单机的IPC应用是首选。非常实用。大量的Unix应用软件都使用unix socket来进行程序间通信。

Unix Domain Socket客户端, Socket模块
简介:使用Unix domain socket的客户端。

#!/usr/bin/perl -w
use strict;
use Socket;
use IO::Handle;
my $path = $ARGV[0] || '/tmp/daytime.sock';
socket(my $sock, PF_UNIX, SOCK_STREAM, 0);
my $sun = sockaddr_un($path);
connect($sock, $sun) or die "Connect: $!n";
$sock->autoflush(1);
my $buf = <$sock>;
my $bs = length($buf);
print "Received $bs bytes, content $bufn";
close $sock;

Unix Domain Socket 服务端, Socket模块
简介:使用Unix domain socket实现的daytime服务器。

#!/usr/bin/perl -w
# tcp_socket_dt_srv.pl
use strict;
use Socket;
use IO::Handle;
use POSIX qw(WNOHANG);
my $path     = $ARGV[0] || '/tmp/daytime.sock';
$SIG{'CHLD'} = sub {
      while((my $pid = waitpid(-1, WNOHANG)) >0) {
            print "Reaped child $pidn";
        }
};
socket(SOCK, PF_UNIX, SOCK_STREAM, 0)
    or die "socket() failed: $!";
setsockopt(SOCK,SOL_SOCKET,SO_REUSEADDR,1)
    or die "Can't set SO_REUSADDR: $!" ;
unlink $path if -r $path;
bind(SOCK,sockaddr_un($path))    or die "bind() failed: $!";
listen(SOCK,SOMAXCONN)           or die "listen() failed: $!";