use POSIX; use IO::Socket; use IO::Select; my $udp = new IO::Socket::INET(LocalAddr => $interface,'LocalPort' => $port, 'Proto' => 'udp') or die $!; my $sockin = new IO::Select; my $sockout = new IO::Select; my $sockerr = new IO::Select; $sockin->add($udp); my ($read, $write, $err) = ([],[],[]); while(1) { ($read, $write, $err) = IO::Select->select($sockin, $sockout, $sockerr, 1); for my $sock (@$read) { my $data; $sock->recv($data, 1024 * 64, 0); next if $! == EAGAIN() || $! == EWOULDBLOCK(); #---- $! is populated by IO::Socket # client request in $data ---- process as you want } for my $sock (@$write) { # not important } for my $sock (@$err) { # clean up any errors } }