IO :: Socket :: INETで同様のコードを使用する場合でも、クライアントが切断されると新しい接続を受け入れることに問題があります。Perlフォークソケットサーバー、クライアントの切断時に接続受け入れを停止します
以前のすべての子が終了/切断されるまで、親は新しい子をフォークするのをやめます。しかし、接続は受け入れられます。
誰かが私が間違っているアイデアを持っていますか?あなたはwaitpid
戻り-1
まで待っているので、すべての子どもたちが、終了したまでそれは意志ループ -
#!/usr/bin/perl -w
use Socket;
use POSIX qw(:sys_wait_h);
sub REAPER {
1 until (-1 == waitpid(-1, WNOHANG));
$SIG{CHLD} = \&REAPER;
}
$SIG{CHLD} = \&REAPER;
$server_port=1977;
socket(SERVER, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, 1);
$my_addr = sockaddr_in($server_port, INADDR_ANY);
bind(SERVER, $my_addr)
or die "Couldn't bind to port $server_port : $!\n";
listen(SERVER, SOMAXCONN)
or die "Couldn't listen on port $server_port : $!\n";
print("[$$] STARTED\n");
while (accept(CLIENT, SERVER))
{
next if $pid = fork;
die "fork: $!" unless defined $pid;
close(SERVER);
print("[$$] CONNECTED\n");
while(<CLIENT>)
{
print("[$$] $_\n");
}
print("[$$] EXIT\n");
exit;
}
continue
{
close(CLIENT);
}
print("[$$] ENDED\n");
これは最小のコードでトリックを行うようです!ありがとうございました。 –