| 前へ << モジュールを使ってみよう (2) | HTTP の並行アクセス >> 次へ | 
IO::Select モジュールも標準モジュールなので、インストールする 必要はありません。
echo-server-select-io-socket.pl
    1: #!/usr/local/bin/perl
    2: 
    3: # $Id: echo-server-select-io-socket.pl,v 1.1 2001/04/21 18:56:41 68user Exp $
    4: 
    5: use IO::Socket;                   # IO::Socket モジュールを使う。
    6: use IO::Select;
    7: 
    8: $port = shift || 5000;            # ポート番号を設定
    9: 
   10: $listening_socket = IO::Socket::INET->new(LocalPort => $port,
   11:                                           Listen    => SOMAXCONN,
   12:                                           Proto     => 'tcp',
   13:                                           Reuse     => 1,
   14:                                          );
   15: 
   16: if ( ! $listening_socket ){
   17:     die "listen できませんでした。 $!\n";
   18: }
   19: 
   20: $selecter = IO::Select->new;
   21: $selecter->add($listening_socket);
   22: 
   23: while (1){
   24:     ($active_socks) = IO::Select->select($selecter,undef,undef,undef);
   25:     
   26:     foreach $sock (@{$active_socks}){
   27:         if ( $sock == $listening_socket ){
   28:             print "NEW CLIENT\n";
   29:             $new_sock = $listening_socket->accept;
   30:             $selecter->add($new_sock);
   31:         } else {
   32:             print "NEW MESSSAGE\n";
   33:             $buf = <$sock>;
   34:             if ( $buf ){
   35:                 print $sock $buf;
   36:                 $sock->flush();
   37:             } else {
   38:                 $selecter->remove($sock);
   39:                 $sock->close();
   40:             }
   41:         }
   42:     }
   43: }
select データに対してビット操作を行う必要がないので、非常に
短く書くことができます。
20: $selecter = IO::Select->new;で、select データの生成、
21: $selecter->add($listening_socket);
30: $selecter->add($new_sock);で、追加。
38: $selecter->remove($sock);で、削除です。4引数 select を使うのと比べると、非常にお手軽ですね。
ただし、IO::Select が使えるのは、IO::Socket で生成した ソケットについてのみです。つまり
| 前へ << モジュールを使ってみよう (2) | HTTP の並行アクセス >> 次へ | 
ご意見・ご指摘は Twitter: @68user までお願いします。