Perl分叉的套接字服务器,当客户端断开连接时停止接受连接 [英] Perl forked socket server, stops accepting connections when a client disconnects

查看:79
本文介绍了Perl分叉的套接字服务器,当客户端断开连接时停止接受连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在使用以下内容时,以及在与IO :: Socket :: INET一起使用类似的代码时,一旦客户端断开连接,我在接受新连接时都会遇到问题.

When using the following, but also when using similar code with IO::Socket::INET, I have problems with accepting new connections, once a client has disconnected.

在所有先前的孩子都已结束/断开连接之前,父母似乎不再分叉新孩子.虽然可以接受连接.

It seems the parent stops forking new children, until all previous children have ended/disconnected. The connection is accepted though.

有人知道我在做什么错吗?

Does anyone have an idea what I'm doing wrong.

#!/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'设置为

On POSIX.1-2001 compliant systems, simply setting $SIG{CHLD} = 'IGNORE' should solve the problem.

这篇关于Perl分叉的套接字服务器,当客户端断开连接时停止接受连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆