#! perl -slw use strict; use IO::Socket; $|++; sub recv_timeout { my( $socket, $timeout ) = @_; ## Set up a select vector for the scoket my $vin = ''; vec( $vin, fileno( $socket ), 1 ) = 1; ## Wait for $timeout seconds if( select( $vin, undef, undef, $timeout ) ) { ## Go fetch my $portaddr = recv( $socket, my($input), 1500, 0) or return; ## Read failed ## Who from my( $port, $addr ) = sockaddr_in( $portaddr ); $addr = join '.', unpack 'C4', $addr; return ( $addr, $port, $input ); } ## Timeout return; } my $server = IO::Socket::INET->new( LocalHost => 'localhost:54321', Proto => 'udp', Reuse => 1. ) or die $^E; ## Set socket non-blocking my $true = 1; ioctl( $server, 0x8004667e, \$true); while( 1 ) { if( my( $addr, $port, $input ) = recv_timeout( $server, 5 ) ) { print "\nGot '$input' from '$addr:$port'"; } printf '.'; }