2013-08-01 129 views
0

我试图用perl创建一个tcp套接字服务器。我成功地创建了一个侦听特定端口的服务器。但在服务一个客户端请求后,Socket服务器正在关闭。服务器不在侦听多个客户端请求。服务客户端在perl后套接字连接关闭

while (accept(Client, Server)) { 
    # do something with new Client connection 
    if ($kidpid = fork) { 
      close Client;   # parent closes unused handle 
      #next REQUEST; 
      next REQUEST if $!{EINTR}; 
    } 
    print "$kidpid\n"; 
    defined($kidpid) or die "cannot fork: $!" ; 

    close Server;    # child closes unused handle 

    select(Client);   
    $| = 1;     ] 
    select (STDOUT); 

    # per-connection child code does I/O with Client handle 
    $input = <Client>; 
    print Client "output11\n"; # or STDOUT, same thing 

    open(STDIN, "<<&Client") or die "can't dup client: $!"; 
    open(STDOUT, ">&Client") or die "can't dup client: $!"; 
    open(STDERR, ">&Client") or die "can't dup client: $!"; 


    print "finished\n";  

    close Client; 
     exit; 
} 

我无法在上面的代码中找到问题。有人可以帮助我吗?

+0

您显示的代码是一个语法错误(至少是杂散的,不匹配的''''''''''''''''',可能还有一个运行时错误(缺少REQUEST标签))。你可以把它变成[显示问题行为的最小代码](http://sscce.org/)? – pilcrow

回答

0

您可以在perlipc(1)手册页中找到INET/TCP套接字服务器的工作示例。我更喜欢使用IO :: Socket标准,如here所述。如果您不想使用IO :: Socket模块,则可以使用示例here。从本手册

服务器的示例代码:

#!/usr/bin/perl -w 
use IO::Socket; 
use Net::hostent;  # for OOish version of gethostbyaddr 

$PORT = 9000;   # pick something not in use 

$server = IO::Socket::INET->new(Proto  => "tcp", 
            LocalPort => $PORT, 
            Listen => SOMAXCONN, 
            Reuse  => 1); 

die "can't setup server" unless $server; 
print "[Server $0 accepting clients]\n"; 

while ($client = $server->accept()) { 
    $client->autoflush(1); 
    print $client "Welcome to $0; type help for command list.\n"; 
    $hostinfo = gethostbyaddr($client->peeraddr); 
    printf "[Connect from %s]\n", $hostinfo ? $hostinfo->name : $client->peerhost; 
    print $client "Command? "; 
    while (<$client>) { 
    next unless /\S/;  # blank line 
    if (/quit|exit/i) { last          } 
    elsif (/date|time/i) { printf $client "%s\n", scalar localtime() } 
    elsif (/who/i)   { print $client `who 2>&1`     } 
    elsif (/cookie/i)  { print $client `/usr/games/fortune 2>&1` } 
    elsif (/motd/i)  { print $client `cat /etc/motd 2>&1`  } 
    else { 
     print $client "Commands: quit date who cookie motd\n"; 
    } 
    } continue { 
     print $client "Command? "; 
    } 
    close $client; 
} 

希望它能帮助!

+0

谢谢pzn。你的代码可以帮助我。我会尽力将儿童流程纳入我的要求。谢谢 – Mohan

相关问题