UDPパケットを投げる

あるファイル(ジャーナル)に保存されている改行区切りのデータを、指定インターフェースから指定されたマルチキャストアドレス、ポートへ送信する。

プロトコルに udp を指定して, ソケットを SOCK_DGRAM で開いてひたすら書き込み。外にパケットを飛ばしたくなかったのでTTLが0になっている。

#!/usr/bin/perl

use strict;
use Getopt::Std;
use Socket;

my %opts = ();
getopts("j:b:d:p:", \%opts);

keys(%opts) != 4 and
    die " usage : udp_server.pl "
        . "-j <journal> -b <bind_addr> -d <dest_addr> -p <dest_port>\n";

my $jrnl = $opts{'j'};
my $baddr_str = $opts{'b'};
my $daddr_str = $opts{'d'};
my $port = $opts{'p'};

print "$jrnl $baddr_str $daddr_str $port";

# ソケット生成〜バインド
my $iaddr = gethostbyname($baddr_str);
my $proto = getprotobyname('udp');
my $ttl = 0;
my $baddr = sockaddr_in(0, $iaddr);

socket(FEED, PF_INET, SOCK_DGRAM, $proto) or die "socket:$!";
defined(setsockopt(FEED, Socket::IPPROTO_IP, Socket::IP_TTL, $ttl))
    or die "setsocketopt:$!";
bind(FEED, $baddr) or die "bind: $!";

my $daddr = inet_aton($daddr_str);
my $sock_addr = pack_sockaddr_in($port, $daddr);

open JRNL, "<$jrnl" or die "can't open journal:$jrnl\n";
while (<JRNL>) {
    chomp;
    my $body = substr($_, 25); # 頭25バイトはヘッダであるようなデータを扱っている
    print "feed : $body\n";
    print "type any key to proceed : ";
    <STDIN>; # wait
    send(FEED, $body, 0, $sock_addr); # 指定 socket address へ送信
}

close JRNL;
close FEED;


参考:404 Not Found