Perl TCP Server, обрабатывающий несколько клиентских подключений - PullRequest
3 голосов
/ 01 февраля 2011

Я предвосхищу это, говоря, что у меня минимальный опыт программирования на Perl и Socket, поэтому я ценю любую помощь, которую могу получить.У меня есть TCP-сервер, который должен обрабатывать несколько клиентских подключений одновременно и иметь возможность получать данные от любого из клиентов в любое время, а также иметь возможность отправлять данные обратно клиентам, основываясь на полученной информации.Например, Клиент1 и Клиент2 подключаются к моему Серверу.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 будут блокироваться, и мне нужен способ реализовать мою команду accept в виде потока, но я не уверен, чтоправильный способ написать это.

1 Ответ

5 голосов
/ 01 февраля 2011

Либо разветвление, нить или мультиплексирование ввода / вывода с помощью select. Взгляните также на Net :: Server и AnyEvent :: Socket . Для примера мультиплексирования ввода / вывода, посмотрите на Как я могу принять несколько соединений TCP в Perl? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...