Сейчас я разрабатываю графический интерфейс для своей сенсорной сети с помощью Perl-TK. Основная проблема заключается в том, что иногда моя сеть с низким энергопотреблением страдает от потери пакетов. В этом случае моя программа Perl застревает, например, в рукопожатии. Рукопожатия выполняются в разных процессах. Я хотел бы кричать для пользователя, когда пакет не получен, и закрыть поток
Есть ли решения для реализации любого тайм-аута для процессов уничтожения?
редактировать: он работает с основным циклом. Но в конкретном процессе не работает, программа останавливается и терминал сбрасывает "Будильник". Половинчатый результат:
#!usr/bin/perl
use Thread;
use IO::Socket::IP;
use Net::IP;
use Time::Out qw(timeout);
use warnings;
$conn_timeout = 2;
$th1=Thread->create(\&thr1);
while(1)
{
sleep(2);
print"main proc\n";
}
sub thr1{
print "thread started\n";
$temp = '2001:4428:29a::280:e103:1:57a8';
$ip=Net::IP::ip_expand_address($temp, 6);
$tempsock = IO::Socket::IP ->new(
PeerAddr => $ip,
PeerPort => '52525',
Proto => 'udp',
) or die "Cannot construct socket, IP address: $ip - error message: - $@";
print "Socket opened successfully for $ip on port 52525\n";
$SIG{ALRM} = sub {print "detaching...\n";thr1->detach(); }; # NB: \n required
alarm $conn_timeout;
$tempsock ->send("asdasd");
$tempsock->recv($tempdata, 16);
alarm 0;
}
редактировать 2: Невозможно использовать сигнал тревоги в потоках... Поэтому я должен измерить время ожидания в связь.