use strict; use warnings; use IO::Socket::INET qw( INADDR_BROADCAST inet_ntoa pack_sockaddr_in unpack_sockaddr_in ); use threads ;#qw( async ); my $client = async { my $s = IO::Socket::INET->new( Proto => 'udp', LocalPort => 7071, Broadcast => 1, ) or die("Can't create socket: $!\n"); defined( my $peer = $s->recv(my $msg, 64*1024, 0) ) or die("Can't recv: $!\n"); my ($port, $addr) = unpack_sockaddr_in($peer); $addr = inet_ntoa($addr); print("Received $msg from $addr:$port\n"); $s->send("Pong!", 0, $peer); }; { my $s = IO::Socket::INET->new( Proto => 'udp', Broadcast => 1, ) or die("Can't create socket: $!\n"); $s->send("Ping!", 0, pack_sockaddr_in(7071, INADDR_BROADCAST)); defined( my $peer = $s->recv(my $msg, 64*1024, 0) ) or die("Can't recv: $!\n"); my ($port, $addr) = unpack_sockaddr_in($peer); $addr = inet_ntoa($addr); print("Received $msg from $addr:$port\n"); } $client->join(); #### Received Ping! from 10.0.0.6:49853 Received Pong! from 10.0.0.6:7071