work.log

元エンジニアの備忘録的ブログ

Perl でマルチキャスト通信をしてみる

投稿:2012-11-21 21:43  更新:

IO::Socket::Multicast を使うと簡単。

以下は試しに書いてみたサンプルコードです。

#!/usr/bin/perl

use strict;
use warnings;
use Getopt::Long;
use IO::Socket::Multicast;

    my $server     = "0";
    my $client     = "0";

    GetOptions

         ("s|server"  => \$server,
          "c|client"  => \$client);

    if ( $server == '1' and $client == '0' ) { &Server; }

    elsif ( $server == '0' and $client == '1' ) { &Client; }

    else { exit; }

sub Server {

    use constant GROUP => '224.1.1.1';
    use constant PORT  => '1100';

    my $sock = IO::Socket::Multicast->new(Proto=>'udp',LocalPort=>PORT);
    $sock->mcast_add(GROUP) || die "Couldn't set group: $!\n";

    while ( 1 ) {

        my $data;

        next unless $sock->recv($data,256);

        print "$data\n";

        sleep 1;

    }

    return;

}

sub Client {

    use constant DESTINATION => '224.1.1.1:1100';
    my $sock = IO::Socket::Multicast->new(Proto=>'udp',PeerAddr=>DESTINATION);

    my $msg = "hello";

    $sock->send($msg) || die "Couldn't send: $!";
    
    return;

}

exit;

■ サーバの実行

# perl mcast.pl -s

■ クライアントの実行

# perl mcast.pl -c

クライアントを実行する度にサーバ側でデータが受信され表示。

# perl mcast.pl -s
hello
hello
hello

マルチキャスト通信を使っているというだけで、ただの echo サーバですけど考え方次第で色々と使えそう。