2014-09-22 1 views
1

Я написал сценарий многосетевого сокета в perl. Я могу установить соединения с несколькими клиентами, использующими fork. Но после установки нового соединения я могу отправлять и получать только один раз. Я не могу больше читать или писать на клиентском сокете, чтобы продолжить разговор.Многопользовательский полнодуплексный Perl-сокет

AIM:

После клиент подключается он будет посылать его идентификатор сервера. Получив идентификатор, сервер будет извлекать файл клиента, используя свой идентификатор, и отправлять его по страницам клиенту. Так как клиент может принимать только ограниченные байты данных, мы не можем отправлять его в один сокет. Поэтому мне нужно отправить 1024 байта данных. Клиент должен подтвердить, и я снова должен отправить следующую страницу. Как и я, я должен сделать соединение сокета в течение длительного времени одновременно для каждого клиента, пока все они не получат весь файл.

Пример кода:

use strict; 
use warnings; 
use IO::Socket::INET; 

# flush after every write 
$| = 1; 
my $data; 
my ($server_socket, $client_socket); 
my ($peer_address, $peer_port); 

$server_socket = new IO::Socket::INET(
    LocalHost => '192.168.0.7', 
    LocalPort => '1008', 
    Proto  => 'tcp', 
    Listen => 5, 
    Reuse  => 1 
) or die "ERROR in Socket Creation : $!\n"; 

print "SERVER Waiting for client connection on port 1008"; 
#$SIG{CHLD}=sub {wait()}; # Signal waiting for the Child process created 
while ($client_socket = $server_socket->accept()) { 
    my $pid = fork(); # Creating child as soon client creates a connection 
    if ($pid == 0)  # Checking the child process 
    { 
     my $peer_address = $client_socket->peerhost(); 
     my $peer_port = $client_socket->peerport(); 
     print "Accepted New Client Connection From : $peer_address, $peer_port\n"; 
     $client_socket->recv($data, 1024); 
     print $data; 
     $client_socket->send("FileLine1"); 

     #Get the acknowledgement 
     $client_socket->recv($data, 1024); 

     $client_socket->send("FileLine2"); 

     #Get the end acknowledgement 
     $client_socket->recv($data, 1024); 
     exit(0); # Exiting child process 
    } 
} 

Мой вопрос: можем ли мы полагаться на Perl для делать это? или Нам нужно пойти на другую платформу, например Java и т. д.

ответ

2

Я настоятельно рекомендую вам использовать модуль CPAN Net::Server для создания вашего сервера.

Net::Server пытается стать универсальным сервером. Он включает в себя возможность запуска в качестве процесса inetd, один сервер соединений, сервер forking, сервер предпродажной поддержки, который поддерживает постоянное количество дочерних элементов, предварительно обработанных, или как управляемый сервер предпродажной поддержки, который поддерживает количество детей на основе нагрузки на сервер ,

+0

Мне действительно нужен пример для «создания постоянного многосетевого сокета» с использованием модуля Net :: Server. Я не могу найти – gzix

 Смежные вопросы

  • Нет связанных вопросов^_^