#!/usr/bin/perl use warnings; use strict; use STUN::RFC_5389; use IO::Socket::INET; die "$0 [port]\n" unless $#ARGV >= 0; my ($server,$port) = @ARGV; $port = $port // 3478; my $request = Client STUN::RFC_5389 { request => 1 }; my $lport = 10000+(int rand 55536); my $socket = new IO::Socket::INET ( LocalPort => $lport, PeerAddr => $server, PeerPort => $port, Proto => 'udp', ) || die "connect: $@\n"; send($socket,$request,0); my $response; recv($socket,$response,1024,0); close($socket); my $mapped_address = ${Client STUN::RFC_5389 $response}{attributes}->{'MAPPED-ADDRESS'}; print $mapped_address->{address},":",$mapped_address->{port},"\n"; my $listen = new IO::Socket::INET ( LocalPort => $lport, Proto => 'udp', ) || die "bind: $@\n"; my $buf; $|=1; while ($listen->recv($buf,1)) { print $buf } die "recv: $!\n";