[PerlChina] 一个奇怪的问题

黄叶 hylinux at gmail.com
Sun Jan 8 23:11:56 PST 2006


我在看<perl网络编程》这本书是有下面一个例子。
分别是第四章和第五章的例子。
显示使用模块Socket

客户端 (我们称之为客户端1 ):
#!/usr/bin/perl -w
 use strict;
 use Socket;
 use IO::Handle;

 my ($bytes_out, $bytes_in) = (0, 0);
 my $host = shift || 'localhost';
 my $port = shift || getservbyname('echo', 'tcp');

 my $protocol = getprotobyname('tcp');

 $host = inet_aton($host);
 my $data_addr = sockaddr_in($port, $host);

 socket(SOCK, AF_INET, SOCK_STREAM, $protocol) or die "$!\n";
 # connect the server
 connect(SOCK, $data_addr) or die "Can't Connect the Server: $!\n";

 SOCK->autoflush(1);

 while ( my $msg_out = <> ) {
    print SOCK $msg_out;
    my $msg_in = <SOCK>;
    print $msg_in;

    $bytes_out += length($msg_out);
    $bytes_in  += length($msg_in);
 }

 close SOCK;
 print "bytes send = $bytes_out, bytes received = $bytes_in\n";


再是服务器端 ( 我们称之为服务端1 ):
 #!/usr/bin/perl
 use strict;
 use warnings;
 use Socket;
 use IO::Handle;
 use constant MY_ECHO_PORT => 2007;

 my ( $bytes_out, $bytes_in ) = (0, 0);

 my $port = shift || MY_ECHO_PORT;
 my $protocol = getprotobyname('tcp');

 $SIG{INT} = sub {
    print STDERR "bytes_send = $bytes_out, bytes_received = $bytes_in\n";
    exit 0;
 };

 socket(SOCK, AF_INET, SOCK_STREAM, $protocol) or die "Socket failed: $!";
 setsockopt(SOCK, SOL_SOCKET, SO_REUSEADDR, 1) or die "$!\n";

 my $my_addr = sockaddr_in($port, INADDR_ANY);

 bind(SOCK, $my_addr);
 listen(SOCK, SOMAXCONN) or die "Listen() failed:$!\n";

 warn "Waitng for incoming connection on port $port...\n";

 while (1) {
    next unless my $remote_addr = accept(SESSION, SOCK);
    my ($port, $hisaddr ) = sockaddr_in($remote_addr);

   warn "Connection from [", inet_ntoa($hisaddr), ", $port]\n";

    SESSION->autoflush(1);

    while ( <SESSION> ) {
       $bytes_in += length($_);
       chomp;

       my $msg_out =  (scalar reverse $_). "\n";
       print SESSION $msg_out;
       $bytes_out += length($msg_out);
    }

    warn "Connection from [", inet_ntoa($hisaddr), ", $port]\n";
    close SESSION;
 }

 close SOCK;


然后再使用IO::Socket模块重写:

客户端 ( 我们称之为客户端2):
#!/usr/bin/perl
 use strict;
 use warnings;
 use IO::Socket;

 my ($bytes_out, $bytes_in) = (0, 0);

 my $host = shift || 'localhost';
 my $port = shift || 'echo';

 $SIG{PIPE} = sub {
    print "it had a PIPE error.\n";
    exit 0;
 };

 my $socket = IO::Socket::INET->new("$host:$port") or die "$@\n";

 while ( defined( my $msg_out = STDIN->getline ) ) {
    print $socket $msg_out;
    my $msg_in = <$socket>;

    print $msg_in;

    $bytes_out += length $msg_out;
    $bytes_in  += length $msg_in;
 }

 $socket->close;
 print STDERR "bytes send = $bytes_out, bytes_received = $bytes_in\n";

服务器端(我们称之为:服务端2):
#!/usr/bin/perl
 use strict;
 use warnings;
 use IO::Socket qw(:DEFAULT :crlf);
 use constant MY_ECHO_PORT => 2007;

 $/ = CRLF;

 my ($bytes_out, $bytes_in) = (0, 0);

 my $quit = 0;

 $SIG{INT} = sub { $quit++; };

 my $port = shift || MY_ECHO_PORT;

 my $socket = IO::Socket::INET->new(
    Listen => 20,
    LocalPort => $port,
    Timeout => 60 * 60,
    Reuse   => 1
 ) or die "Can't create listen port: $!\n";

 warn "Waiting for incoming connections on port $port ......\n";

 while ( !$quit ) {
    next unless my $session = $socket->accept;

    $session->autoflush(1);

    my $peer = gethostbyaddr( $session->peeraddr, AF_INET) ||

      $session->peerhost;

    my $port = $session->peerport;

    warn "Connection from [$peer, $port]\n";

    while ( my $str = <$session> ) {
       print $str, "\n";
       $bytes_in += length $str;
       chomp $str;
       my $msg_out = (scalar reverse $str)."\n";
       print $msg_out, "\n";
       print $session $msg_out;

       $bytes_out += length $msg_out;
    }

    warn "Connection from [$peer, $port] finished\n";
    close $session;
 }

 print STDERR "bytes send = $bytes_out, bytes received = $bytes_in\n";

 close $socket;


现在问题就来了。
如果我们使用客户端1和客户端2连接服务器端1, 没有问题,很正常。
但是如果我使用客户端1和客户端2连接服务器端2是就有问题,
发现客户端接受不到任何返回。

比较奇怪,请帮我看看。
谢谢。
-------------- next part --------------
q?????!???,r??m??m???????j+??j)r?j??j?r????:?=?o?!???


More information about the China-pm mailing list