- 论坛徽章:
- 0
|
只是一个简单的命令传输器,可以执行server的一些命令而已。
现在问题是第一次连接能够成功,执行都没有问题。但退出之后就不能够再次连接,出现connection refused的错误
而且server进程占cup开始彪升
看了半天解决不了了,高手帮忙看看
下面是主程序的主逻辑部分。
附件有所有代码
- #!/usr/bin/perl
- use strict;
- use warnings;
- use watch;
- use IO::Socket;
- use IO::File;
- use Log::Tiny;
- use Fcntl;
- use POSIX qw/WNOHANG setsid/;
- use constant LOCALHOST => 127.0.0.1;
- use constant PORT => 2007;
- use constant PIDFILE => '/var/tmp/watch.pid';
- use constant USER => 'nobody';
- use constant GROUP => 'nogroup';
- my ( $pid, $log, $server ) = ( 0, 0, 0 )
- ; #给pid赋值,防止出现在父进程结束时有pid无初值的错误
- my %commands = (
- q => sub { undef },
- ps => sub { $server->ps(); },
- w => sub { $server->w(); },
- dt => sub { $server->show(); },
- free => sub { $server->free(); }
- );
- my $port = PORT;
- my $pidfile = PIDFILE;
- my $quit = 0;
- $pid = initserver( PIDFILE, USER, GROUP );
- $server = new watch(
- Listen => 20,
- LocalPort => $port,
- Reuse => 1,
- Timeout => 60 * 60
- );
- die "Can not socket:$@\n" unless $server;
- $log->INFO("Listening on port:$port\n");
- my $sock = $server->getSock;
- $SIG{'INT'} = $SIG{'TERM'} = sub { $quit++ };
- while ( !$quit ) {
- next unless my $cl = $sock->accept;
- my $peerhost = $cl->peerhost;
- my $peerport = $cl->peerport;
- my $client = " [$peerhost:$peerport] ";
- $log->INFO("connection from $client established\n");
- while (<$cl>) {
- chomp;
- $_ =~ /^q$/i and last;
- if ( exists( $commands{$_} ) ) {
- my $sub = $commands{$_};
- $log->INFO("client $client sends command: $_\n");
- my @c = $sub->();
- foreach (@c) {
- print $cl $_ . "\n";
- }
- }
- else {
- $log->WARN("unknow command: $_ from client $client!\n");
- print $cl "unknow command\n";
- }
- }
- print $cl "bye\n";
- $server->sockclose();
- }
复制代码 |
|