#!/usr/local/bin/perl # $Id: echo-server-fork-io-socket.pl,v 1.2 2001/12/05 19:31:18 68user Exp $ use IO::Socket; # IO::Socket モジュールを使う。 $port = shift || 5000; # ポート番号を設定 $listening_socket = IO::Socket::INET->new(LocalPort => $port, Listen => SOMAXCONN, Proto => 'tcp', Reuse => 1, ); if ( ! $listening_socket ){ die "listen できませんでした。 $!\n"; } print "親プロセス($$): ポート $port を見張ります。\n"; while (1){ $new_socket = $listening_socket->accept(); $client_sockaddr = $new_socket->peername(); ($client_port,$client_iaddr) = unpack_sockaddr_in($client_sockaddr); $client_hostname = gethostbyaddr($client_iaddr,AF_INET); $client_ip = inet_ntoa($client_iaddr); print "接続: $client_hostname($client_ip) ポート $client_port\n"; if ( $pid = fork() ){ # 親プロセス print "親プロセス($$): 引続きポート $port を見張ります。\n"; print "クライアントの相手は子プロセス $pid が行います。\n"; $new_socket->close(); } else { # 子プロセス $listening_socket->close(); select($new_socket); $|=1; select(STDOUT); while (<$new_socket>){ print "子プロセス($$): メッセージ $_"; print $new_socket $_; } $new_socket->close(); print "子プロセス($$): 接続が切れました。終了します。\n"; exit; } }