Perl fork 套接字服务器,当客户端断开连接时停止接受连接

标签 perl sockets fork

在使用以下代码时,以及在 IO::Socket::INET 中使用类似代码时,一旦客户端断开连接,我在接受新连接时就会遇到问题。

似乎 parent 停止 fork 新的 child ,直到所有以前的 child 都结束/断开连接。虽然连接被接受。

有没有人知道我做错了什么。

#!/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");

最佳答案

在 POSIX.1-2001 兼容系统上,只需设置 $SIG{CHLD} = 'IGNORE' 就应该 solve the problem .

关于Perl fork 套接字服务器,当客户端断开连接时停止接受连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7662711/

相关文章:

perl - 从 perl 调用带有反引号的 find - find : write error: Broken pipe

perl - 如何在 Perl 中使用 && 运算符

javascript - 如何将 Perl 变量传递给 Javascript 函数?

perl - 如何使用命令行获取whois信息?

android - 使用模拟器作为服务器和客户端的两个应用程序之间的通信

java - serverSocket.accept() 缓慢或无响应

perl - 在 fork/execs 的程序上使用 Devel::NYTProf

我可以通过两者之间的服务器实现客户端 - 客户端通信吗?

C编程: Fork() and IPC with Pipes

c - 如何等待子进程并获取其返回值