技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

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;
}