0

以下のクライアントとサーバーが perl で書かれています。問題は、クライアントがサーバーからメッセージを適切に送受信しないことです。要件は、サーバーにメッセージを送信し、サーバーからの応答を取得し、それに基づいて決定を下すことです。STDOUTとSTDINを使用してサーバークライアントテストクラスを作成し、それらは正常に機能しています。送信コマンドのたびにENTERを押すからだと思います。

クライアント

#!/usr/bin/perl

my $rhostname='192.168.0.181';
my $hostname="support";
my $port='7071';
my $script_log_dir="/var/sdplog/support";

use IO::Socket; 
use strict;

$| = 1;  
my $host_ip='0.0.0.0';
my $host_port='7088';
my $sock = new IO::Socket::INET ( 
    PeerAddr => $rhostname, 
    PeerPort => $port,
    Proto => 'tcp', 
   ); 
   die "Could not create socket: $!\n" unless $sock; 
   $sock->autoflush(1);

   my $query = "START:192.168.0.20:3:1:1:".$host_ip.":".$host_port;

   my $count=0;

   print "sending $query\n";
   print $sock "$query";

   my $data = <$sock>;
   print $data;
   close($sock);

サーバー - コード

while ($q != -999){
    $logger->debug('waiting for socket....');
    my $new_sock = $sock->accept();
#       sleep(5);
    $i++;   
    $logger->debug($i.' accept');
    while(<$new_sock>) {

    #       print $_;
            $logger->debug("received command - ".$_);
            my $ip_status = 2;

            @input_command = split(':', $_);

            $command = @input_command[0];
            $server_ip = @input_command[1];
            $retry_count= @input_command[2];
            $wait_time = @input_command[3];
            $next_ping_wait = @input_command[4];
            $client_ip = @input_command[5];
            $client_port = @input_command[6];

            @ping_array=($server_ip,$retry_count,$wait_time,$next_ping_wait);
            $logger->debug("received request ".@input_command);
            $logger->debug($command);
            if ($command eq "START"){
                    $logger->debug($command." received. checking server status");
                    $ip_status = network->ping_ip(@ping_array);
                    $logger->debug("ping status - ".$ip_status);
#                       $logger->debug($client_ip.$client_port);
    #               send_message($client_ip,$client_port,$ip_status); # do some 
                    sleep(2);
                    print $new_sock "$ip_status\n";

            }else{

                    $logger->debug($command." received");          }
            }
}

close($sock);
exit 0;

サーバーはリッスン状態です。以下のクライアントを実行すると、出力が表示されます。

>perl client.pl 
sending START:192.168.0.20:3:1:1:0.0.0.0:7088

サーバー上

2012/08/21 18:49:04 DEBUG> server.pl:89 main:: - waiting for socket....
2012/08/21 18:49:08 DEBUG> server.pl:93 main:: - 1 accept

しかし、それだけです。CTRL+C クライアントをクリックすると、クライアントが終了し、サーバー上の残りのログが期待どおりに印刷されます。サーバーから読み取るためにフラッシュしていないようです。

2012/08/21 18:56:05 DEBUG> server.pl:97 main:: - received command -   START:192.168.0.20:3:1:1:0.0.0.0:7088
2012/08/21 18:56:05 DEBUG> server.pl:113 main:: - received request 7
2012/08/21 18:56:05 DEBUG> server.pl:114 main:: - START
2012/08/21 18:56:05 DEBUG> server.pl:116 main:: - START received. checking server  status
2012/08/21 18:56:05 DEBUG> network.pm:31 network::ping_ip - 192.168.0.20 is alive
2012/08/21 18:56:05 DEBUG> server.pl:118 main:: - ping status - 1
2012/08/21 18:56:07 DEBUG> server.pl:89 main:: - waiting for socket....

しかし、解決策を見つけることができませんでした。私はこれで数時間立ち往生しているので、光を当ててください。

4

1 に答える 1

2

サーバーはEOFまたは改行記号を待っていますが、クライアントではそれを送信しません。クライアントを終了すると、サーバーは EOF を受け取り、サーバーは読み取りを停止し$new_sock、他のすべてのコードは期待どおりに機能します。

に改行記号を追加する必要があり$queryますclient

-print $sock "$query";
+print $sock $query."\n";

そしてchomp、受信したデータについてserver

while(<$new_sock>) {
+    chomp;
于 2012-08-21T12:16:44.853 に答える