第9章のサンプルコード
---------------------
目次（ページ番号）
■P204
■P205
■P206
■P207
■P208
■P210
---------------------

■P204
# 文字入力をそのまま返すサーバースクリプト
#  echoserver.pl

# モジュールの使用宣言
use IO::Socket;

# ソケットオブジェクト作成
$server_socket = new IO::Socket::INET (
                        LocalPort => '10000',
                        Proto => 'tcp',
                        Listen => 5,
                        Reuse => 1 );
unless ($server_socket) {
  print "Socket Error:$!\n";
}

# 待機
$client_socket = $server_socket->accept( );

# クライアントからの入力を表示
while ($string = <$client_socket>) {
  print "受理:$string";
}

# ソケットを閉じる
$client_socket->close( );
$server_socket->close( );

■P205
# 文字入力をサーバーに送るクライアントスクリプト
#  echoclient.pl

# モジュールの使用宣言
use IO::Socket;

# ソケットオブジェクト作成
$client_socket = new IO::Socket::INET (
                        PeerAddr => 'localhost',
                        PeerPort => '10000',
                        Proto => 'tcp',
                        TimeOut => '5' );
unless ($client_socket) {
  print "Socket Error:$!\n";
}

# 入力をサーバーに送信
while ($string = <STDIN>) {
  if ($string =~ /^QUIT/) {
    # QUITという文字列で始まる入力があると終了
    last;
  }
  print $client_socket "$string";
}

# ソケットを閉じる
$client_socket->close( );

■P206
# 簡単な回文のサーバースクリプト
#  reverseserver.pl

# モジュールの使用宣言
use IO::Socket;

# ソケットオブジェクト作成
$server_socket = new IO::Socket::INET (
                        LocalPort => '10000',
                        Proto => 'tcp',
                        Listen => 5,
                        Reuse => 1 );
unless ($server_socket) {
  print "Socket Error:$!\n";
}

# クライアントからの入力
do {
  # 待機
  $client_socket = $server_socket->accept( );
  print "Connect\n";
  while ($string = <$client_socket>) {
    # 改行記号を除く
    chomp($string);
    # 回文を返す(splitに//を入れると対象文字列を1文字ずつに区切る)
    print $client_socket reverse(split(//, $string)), "\n";
  }
  $client_socket->close( );
  print "Close\n";
} until (0);

# ソケットを閉じる
$server_socket->close( );

■P207
# 簡単な回文のクライアントスクリプト
#  reverseclient.pl

# モジュールの使用宣言
use IO::Socket;

# ソケットオブジェクト作成
$client_socket = new IO::Socket::INET (
                        PeerAddr => 'localhost',
                        PeerPort => '10000',
                        Proto => 'tcp',
                        TimeOut => '5' );
unless ($client_socket) {
  print "Socket Error:$!\n";
}

# 入力をサーバーに送信
while ($string = <STDIN>) {
  if ($string =~ /^QUIT/) {
    # QUITという文字列があると終了
    last;
  }
  print $client_socket "$string";

  # サーバーからの出力を受信して表示
  $receive = <$client_socket>;
  print $receive;
}

# ソケットを閉じる
$client_socket->close( );

■P208
# 回文のサーバースクリプト (forkを使って複数のクライアントをサポート)
#  reverseserver_fork.pl

# モジュールの使用宣言
use IO::Socket;

# 子プロセスの終了時の処理
$SIG{CHLD} = sub { wait( ) };

# ソケットオブジェクト作成
$server_socket = new IO::Socket::INET (
                        LocalPort => '10000',
                        Proto => 'tcp',
                        Listen => 5,
                        Reuse => 1 );
unless ($server_socket) {
  print "Socket Error:$!\n";
}

# クライアントからの入力
do {
  $client_socket = $server_socket->accept( );
  # 待機
  if ($pid = fork( )) {
    # 親プロセスはすぐに待機に戻る
  }
  elsif (defined $pid) {
    while ($string = <$client_socket>) {
      # 改行記号を除く
      chomp($string);
      # 回文を返す(splitに//を入れると対象文字列を1文字ずつに区切る)
      print $client_socket reverse(split(//, $string)), "\n";
    }
    # 子プロセスはここで終わる
    exit;
  } else {
    die "forkできません: $!\n";
  }
} until (0);

# ソケットを閉じる
$server_socket->close( );


■P210
# Webブラウザスクリプト
#  browser.pl

# モジュールの使用宣言
use IO::Socket;

# URLを入力
print "URLを指定してください: ";
$url = <STDIN>;

# URLをホスト名とファイルパスに分割
chomp($url);
if ($url =~ /http:\/\/([^\/]+)(\/.*)/) {
  $host = $1;
  $file = $2;
} else {
  die "そのURLには対応していません。\n";
}

# ソケットオブジェクト作成
$client_socket = new IO::Socket::INET (
                        PeerAddr => $host,
                        PeerPort => 'http',
                        Proto => 'tcp',
                        TimeOut => '5' );
unless ($client_socket) {
  print "Socket Error:$!\n";
}

# 入力をサーバーに送信
print "$host $file" . "\n";
print $client_socket "GET $file HTTP/1.0\n\n";

# 出力を取得し、表示(複数行が返ってくるので、取り終わるまで繰り返す)
while ($receive = <$client_socket>) {
  print $receive;
}

# ソケットを閉じる
$client_socket->close( );
