У меня есть этот маленький скрипт, который хорошо справляется со своей работой, но иногда он не работает. Сбой в 2 случаях:
с ошибкой отправки: Cannot determine peer address at ./tcp-new.pl line 52
без вывода или чего-либо еще, он просто не может доставить то, что получил на подключенный клиент Tcp. Обычно это происходит после того, как я отключаюсь от сервера, иду домой и подключаюсь снова. Для исправления этого требуется перезагрузка, и она начинает работать. Иногда за этой проблемой следует проблема, упомянутая в пункте 1.
Примечание: это не проблема, когда я отключаюсь и снова подключаюсь к нему в течение короткого промежутка времени (если не возникает ошибка 1)
Так может ли кто-нибудь помочь мне сделать этот код более стабильным, чтобы мне не приходилось перезапускать его каждый день?
#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket;
use IO::Select;
my $tcp_port = "10008";
my $udp_port = "2099";
my $tcp_socket = IO::Socket::INET->new(
Listen => SOMAXCONN, LocalPort => $tcp_port,
Proto => 'tcp', ReuseAddr => 1,
);
my $udp_socket = IO::Socket::INET->new(
LocalPort => $udp_port, Proto => 'udp',
);
my $read_select = IO::Select->new();
my $write_select = IO::Select->new();
$read_select->add($tcp_socket);
$read_select->add($udp_socket);
while (1) {
my @read = $read_select->can_read();
foreach my $read (@read) {
if ($read == $tcp_socket) {
my $new_tcp = $read->accept();
$write_select->add($new_tcp);
} elsif ($read == $udp_socket) {
my $recv_buffer;
$udp_socket->recv($recv_buffer, 1024, undef);
my @write = $write_select->can_write();
foreach my $write (@write) {
$write->send($recv_buffer);
}
}
}
}