【问题标题】:Perl TCP Server handling multiple Client connectionsPerl TCP 服务器处理多个客户端连接
【发布时间】:2011-01-31 22:42:59
【问题描述】:

我会先说我对 Perl 和 Socket 编程的经验很少,所以我很感激我能得到的任何帮助。我有一个 TCP 服务器,它需要同时处理多个客户端连接,并且能够随时从任何一个客户端接收数据,并且还能够根据接收到的信息将数据发送回客户端。例如,Client1 和 Client2 连接到我的服务器。 Client2 发送“Ready”,服务器对其进行解释并将“Go”发送给 Client1。以下是我目前所写的:

my $sock = new IO::Socket::INET 
{
    LocalHost => $host, // defined earlier in code
    LocalPort => $port, // defined earlier in code
    Proto => 'tcp',
    Listen => SOMAXCONN,
    Reuse => 1,
};
die "Could not create socket $!\n" unless $sock;

while ( my ($new_sock,$c_addr) = $sock->accept() ) {
    my ($client_port, $c_ip) = sockaddr_in($c_addr);
    my $client_ipnum = inet_ntoa($c_ip);
    my $client_host = "";

    my @threads;

    print "got a connection from $client_host", "[$client_ipnum]\n";
    my $command;
    my $data;

    while ($data = <$new_sock>) {
        push @threads, async \&Execute, $data;
    }
}

sub Execute {
    my ($command) = @_;

    // if($command) = "test"
    // send "go" to socket1

    print "Executing command: $command\n";
    system($command);
}

我知道我的两个 while 循环都会阻塞,我需要一种方法将我的接受命令实现为线程,但我不确定编写它的正确方法。

【问题讨论】:

    标签: multithreading perl tcp


    【解决方案1】:

    fork、thread 或使用 select 进行 I/O 多路复用。看看Net::ServerAnyEvent::Socket。有关 I/O 多路复用的示例,请查看 How can I accept multiple TCP connections in Perl?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-28
      • 2022-01-17
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 2010-09-22
      相关资源
      最近更新 更多