0

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

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;
}

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

4

1 回答 1

0

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

本手册中的服务器示例代码:

 #!/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;
 }

希望能帮助到你!

于 2013-08-01T20:11:38.600 回答