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