(отредактировано для предоставления сокращенного тестового примера согласно комментариям ниже)
Я сталкиваюсь со странной ситуацией, когда, если я разветвляюсь на соединение "WSS", чтобы отправить сообщение, сокет закрывается, когдаребенок выходит.Тем не менее, когда я выполняю разветвление для обработки соединения «WS», соединение остается открытым при выходе из дочернего процесса.
- Сведения о сервере: Perl 5.26, Ubuntu 16
- Сведения о клиенте: Perl 5.18, OSX
Код сервера:
use Net::WebSocket::Server;
use IO::Socket::SSL;
$SIG{CHLD}='IGNORE';
my $enable_ssl = 1; # If you make this one the problem reveals itself
# you need to point this to your own certs
my $ssl_cert_file = "/etc/letsencrypt/live/mydomain/fullchain.pem";
my $ssl_key_file = "/etc/letsencrypt/live/mydomain/privkey.pem";
# To show the problem, all I'm doing is I'm forking and sending current time
sub process {
my $serv = shift;
my $pid = fork();
if ($pid == 0 ) {
print ("fork start\n");
$_->send_utf8(time) for $serv->connections;
print ("fork end\n");
exit 0;
}
}
my $ssl_server;
if ($ssl_enable) {
$ssl_server = IO::Socket::SSL->new(
Listen => 10,
LocalPort => 9000,
Proto => 'tcp',
Reuse => 1,
ReuseAddr => 1,
SSL_cert_file => $ssl_cert_file,
SSL_key_file => $ssl_key_file
);
}
Net::WebSocket::Server->new(
listen => $enable_ssl? $ssl_server: 9000,
tick_period=>5,
on_tick=> sub {
my ($serv) = @_;
process($serv);
#$_->send_utf8(time) for $serv->connections;
},
)->start;
Вот код клиента:
my $client = AnyEvent::WebSocket::Client->new;
# replace with your server
$client->connect("wss://myserver:9000")->cb(sub {
our $connection = eval { shift->recv };
if($@) {
print ("connection error");
warn $@;
return;
}
# recieve message from the websocket...
$connection->on(each_message => sub {
my($connection, $message) = @_;
my $msg = $message->body;
print ("GOT $msg\n");
});
});
AnyEvent->condvar->recv;
Ожидаемое поведение
Клиент будет продолжать отображать метки времени
Наблюдаемое поведение
Клиент получает самое первое сообщение и печатает его.Когда сервер выходит из своего форка, клиент перестает получать больше сообщений, и соединение прерывается
Как заставить его работать
У нас есть два варианта:
- Не подключайтесь к серверу.Отправьте сообщение непосредственно в процесс sub
- Не используйте SSL
Поэтому я пришел к выводу, что SSL + fork == problem.
Мысли?