while (1) { foreach my $connection (my @can_read = $select->can_read(5)) { if ($connection == $listen_socket) { my $client = $listen_socket->accept(); $select->add($client); $client->recv($data,1024); if ($data) { my @received = unpack('C*', $data); my $id=join('', map {sprintf('%02x', $_)} @received); if (exists($con_hash{ $id })) { if ($con_hash{ $id } != $client) { &do_log("ID $id changed socket from $con_hash{ $id } to $client, updating entry"); $con_hash{ $id }=$client; } else { &do_log("ID $id re-connected on same socket $client"); } } else { if ($id) { &do_log("Creating connection entry for ID $id"); $con_hash{ $id }=$client; while( my ($k, $v) = each %con_hash ) { &do_log ("Connected ID: $k, socket: $v"); } } else { &do_log("ERROR: Something is wrong"); } } } else { &do_log("ERROR: Something else is wrong"); } } else { &do_log("Closing connection to $connection"); while( my ($key, $value) = each %con_hash ) { if ($value == $connection) { &do_log("Deleting connection entry for ID $key"); delete $con_hash{$key}; } } while( my ($k, $v) = each %con_hash ) { &do_log ("Connected ID: $k, socket: $v"); } $select->remove($connection); close($connection); } } foreach my $connection (my @can_write = $select->can_write(5)) { my @send_dec=qw(T E S T); my $send_hex=pack('C*', @send_dec); while( my ($con_id, $sock) = each %con_hash ) { &do_log("Sending data to ID $con_id via socket $sock: ".join('', map {sprintf('%02x', $_)} @send_dec)); $sock->send($send_hex); $sock->recv($data,1024); my @recv_dec = unpack('C*', $data); &do_log("Received data from ID $con_id via socket $sock: ".join('', map {sprintf('%02x', $_)} @recv_dec)); } } sleep (5); }