| 前へ << モジュールを使ってみよう (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 までお願いします。