52 lines
1.0 KiB
Perl
52 lines
1.0 KiB
Perl
#!/usr/bin/env perl
|
|
|
|
use v5.38.2;
|
|
use strict;
|
|
use warnings;
|
|
|
|
use IO::Socket::INET;
|
|
|
|
my $server = IO::Socket::INET->new(
|
|
LocalPort => 19132,
|
|
LocalHost => '0.0.0.0',
|
|
Proto => 'udp',
|
|
);
|
|
|
|
my %sockets;
|
|
|
|
my $buf = '';
|
|
while ($server->recv($buf, 1024)) {
|
|
my $host = $server->peerhost;
|
|
my $port = $server->peerport;
|
|
my $source = "$host:$port";
|
|
generate_socket($source, $server) if !defined $sockets{$source};
|
|
my $final_socket = $sockets{$source};
|
|
$final_socket->send($buf);
|
|
$buf = '';
|
|
}
|
|
|
|
sub generate_socket($source, $server) {
|
|
$sockets{$source} = connect_final();
|
|
my $pid = fork;
|
|
if (!$pid) {
|
|
my $buf = '';
|
|
while ($sockets{$source}->recv($buf, 1024)) {
|
|
$server->send($buf);
|
|
$buf = '';
|
|
}
|
|
}
|
|
}
|
|
|
|
sub connect_udp($host, $port) {
|
|
my $socket = IO::Socket::INET->new(
|
|
PeerPort => $port,
|
|
PeerHost => $host,
|
|
Proto => 'udp',
|
|
);
|
|
return $socket;
|
|
}
|
|
|
|
sub connect_final {
|
|
return connect_udp('192.168.2.1', 19132);
|
|
}
|