【これだけ覚えりゃなんとか使えるPerlメモ9】TCPサーバとクライアント

日時を返却するTCPサーバと、TCPサーバにアクセスするクライアントの例。

tcp_server.pl

#! /usr/bin/perl
# 日時を返却するTCPサーバ
use Socket;

$port = shift || 9999;
$proto = getprotobyname('tcp');

socket(ListenSock, PF_INET, SOCK_STREAM, $proto) or die("cannot open socket : $!\n");
bind(ListenSock, sockaddr_in($port, INADDR_ANY)) or dir("cannot bind docket : $!\n");

listen(ListenSock, SOMAXCONN);

print "LISTEN PORT : $port\n";
while ( $sockaddr = accept(ConnectSock, ListenSock)) {
    select (ConnectSock);
    $| = 1;
    select(STDOUT);
    my ($port, $ipaddr) = sockaddr_in($sockaddr);
    my $name = gethostbyaddr($ipaddr, AF_INET);
    $ipaddr = inet_ntoa($ipaddr);
    print "connect from $name($ipaddr)\n";
    print ConnectSock "Hello $name, now ", scalar localtime, "\n";
    close(ConnectSock);
}

close(ListenSock);
exit;


サーバに接続するクライアント

tcp_client.pl
#! /usr/bin/perl

use Socket;

$host = shift || 'localhost';
$port = shift || 9999;

$port = getservbyname($port, 'tcp') if ($port=~ /\D/ );
die ("not exists port") unless ($port);

$ipaddr = inet_aton($host) or die("not found $host\n");
$sockaddr = sockaddr_in($port, $ipaddr);

$proto = getprotobyname('tcp');
socket(SOCK, PF_INET, SOCK_STREAM, $proto) or die("cannot open socket \n");
connect(SOCK, $sockaddr) or die("cannot connect \n");

while(<SOCK>) {
    { print; }
}
close(SOCK) or die("cannot close socket\n");
exit;