处理多个客户端连接的Perl TCP服务器
问题描述:
我将在前言中说我对Perl和Socket编程有最小的经验,所以我很感激我能得到的任何帮助。我有一个TCP服务器需要同时处理多个客户端连接,并且能够随时从任何一个客户端接收数据,并且能够根据收到的信息将数据发送回客户端。例如,Client1和Client2连接到我的服务器。客户端2发送“就绪”,服务器解释并发送“去”到客户端1。下面是我到目前为止写:处理多个客户端连接的Perl TCP服务器
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循环将被阻止的,我需要一种方法来实现我接受命令的线程,但我不知道正确的方法写它。
答
叉或线程或I/O多路复用与选择。请看Net::Server和AnyEvent::Socket。有关I/O多路复用的示例,请参阅How can I accept multiple TCP connections in Perl?。