説明接続中のノード番号一覧を取得します。
構文@nodes = nodes()
引数ありません。
返り値@nodes : ノードリスト ( データ型: 配列, 値: 接続したノード番号, 順序: 接続順 ) = ( nodeno, nodeno, ... )
備考ノードがBBS.pmに接続またはBBS.pmから切断すると接続ステータスが更新され、 本関数を呼び出することで接続するノードと接続順を得ることができます。
接続ステータスの更新はonConnectハンドラが呼び出される直前、または、 onDisconnectハンドラが呼び出される直前で行われます。
onDisconnectハンドラから削除対象のノード番号は関数from()で取得することはできますが、 削除対象のノード番号はonDisconnectハンドラが呼び出される前に接続リストから除去されるため、 呼び出されたonDisconnectハンドラから本関数を呼び出しても取得することはできません。
sub ondisconnect { my $self = shift; my $me = $self->from(); # 切断するノード番号を得ることは可能 my @nodes = $self->nodes(); # サーバに接続する全ノード番号のリストを取得しても # 取得する配列には切断するノード番号が除外されているため # 接続順位を得ることはできない
用例チャットなど、あるノードのメッセージを接続する全てのノードに送信するような場合は、次のようになります。
$chat->broadcast('Hello'); # メッセージを一斉送信 sub broadcast { my $self = shift; # chatオブジェクト my $msg = shift; # メッセージ my $me = $self->from(); # 発言者のノード番号を得る my @listener = $self->nodes(); # サーバに接続する全ノード番号のリストを得る while (my $to = shift( @lintener ) ) { # 受け手のノード番号をリストから得る next if ( $me == $to ); # 発言者と受け手のノード番号が同じなら次の受け手へ $self->send( $msg, $to ); # 聴衆者にメッセージを送信(発言者と受け手のノード番号が違うなら) }