ゆるゆるエンジニアの技術メモ

神奈川在住のITエンジニアの忘備録です。主にプログラミング(Perl, Java など)やネットワーク技術について、学んだことを自分の中で整理するために書いています。書いたことが誰かのご参考になれば幸いです。

udpパケットを送信するスクリプト

指定したホスト、ポートに udpパケットを送信する perl スクリプト sendUdpData.pl を作成した。テストなどで、パケットキャプチャで取得したデータ(16進ダンプ文字列)を、好きな場所に送りたい場合に使う用途で作成した。

使い方は以下。

perl sendUdpData.pl -h 送信先ホスト -p 送信先ポート -d 送信データ(16進ダンプ文字列)


送信データ(16進ダンプ文字列)はファイルから与えることもできる。

perl sendUdpData.pl -h 送信先ホスト -p 送信先ポート -f 送信データファイル


何も引数を指定しないと、以下を実行する。

perl sendUdpData.pl -h localhost -p 162 -d "74 65 73 74"

「74 65 73 74」は「test」の16進ダンプ文字列である。


sendUdpData.pl

use strict;
use warnings;
use Socket;
use Getopt::Long 'GetOptions';

my $destHost = 'localhost';
my $destPort = 162;
my $sendData;
my $sendDataFile;

GetOptions(
    'host=s' => \$destHost,
    'port=i' => \$destPort,
    'data=s' => \$sendData,
    'file=s' => \$sendDataFile
);

if (!$sendData) {
    if ($sendDataFile and (-f $sendDataFile)) {
        $sendData = getDataFromFile($sendDataFile);
    }
    else {
        $sendData = '74 65 73 74'; # test
    }
}

if (length($sendData) == 0) {
    die("No data to send...");
}

$sendData =~ s/\s//g;
my $packedSendData = pack("H*", $sendData);

socket(my $socket, PF_INET, SOCK_DGRAM, 0) or die "Failed to create socket. $!";
my $addrBin = inet_aton($destHost);
my $sockAddr = pack_sockaddr_in($destPort, $addrBin);
send($socket, $packedSendData, 0, $sockAddr) or die "Failed to send. $!";

sub getDataFromFile {
    my $sendDataFile = shift;
    my $sendData;
    open(my $fh, $sendDataFile) or die "Failed to open $sendDataFile. $!";
    while (my $line = <$fh>) {
        chomp($line);
        $sendData .= $line;
    }
    return $sendData;
}