while (1) {
if ($server_sock->recv($rcvd_data,1024)) {
print "Got a client, address ".$server_sock->peerhost().", port ".$server_sock->peerport().".\n";
my $new_sock=IO::Socket::INET->new(LocalPort=>$new_socknum,LocalAddr=>'localhost',Proto=>'udp',Blocking=>0);
$server_sock->send("$new_socknum\n");
print "Sent client their new port of $new_socknum!\n";
threads->create('handleAClient',$new_sock->peeraddr(),$new_socknum);
$new_sock->close();
$new_socknum+=1;
}
}
####
$socket->send("Go!\n");
$socket->recv($data,1024);
$port=decodeUDP($data,1024);
print "Got port num: $port!\n";
$socket->close();
sleep(3);
$socket=IO::Socket::INET->new(PeerHost=>$ip,PeerPort=>$port,Proto=>'udp',LocalAddr=>$own_ip);
if ($socket) { print "Reconnected to dedicated port $port ok!\n"; }
else { die "Error switching to dedicated port $port!\n"; }
####
sub decodeUDP {
my $packet=shift;
my $size=shift;
return unpack("A$size",$packet);
}
####
sub handleAClient {
my $my_addr=shift;
$clients[$#clients+1]=$my_addr;
my $my_port=shift;
$port_nums[$#port_nums+1]=$my_port;
my $udp_data;
my $cli_sock=IO::Socket::INET->new(LocalPort=>$my_port,LocalAddr=>'localhost',Proto=>'udp',Blocking=>0) or die "Could not create socket with port $my_port!\n";
while (1) {
if($cli_sock->recv($udp_data,1024)) {
my $counter=0;
foreach my $cli (@clients) {
#print "cli val: ".$cli."\n";
#print "Cli pn ".$port_nums[$counter]." my pn ".$local_client->peerport()."\n";
if ($port_nums[$counter]!=$my_port) {
my $sock=IO::Socket::INET->new(PeerPort=>$port_nums[$counter],PeerAddr=>$cli,Proto=>'udp',Blocking=>0);
$sock->send("<".$my_addr.":".$my_port."> ".$udp_data."\n");
$sock->close();
}
$counter+=1;
}
}
}
}