- 论坛徽章:
- 0
|
刚开始看perl 请多指教。我是看了网上的一个多进程代码http://beatasatan.blog.sohu.com/55313188.html自己想做点改进
目标:
Server 会发送一些列命令给client,client收到后回复server。
收到命令'EXIT',client 断开连接。
问题:
1.server 和 client端如何实现数据交互?sysread 和syssend?
客户端代码
# tcp_iosocket_cli.pl
use strict;
use IO::Socket;
my $addr = $ARGV[0] || '127.0.0.1';
my $port = $ARGV[1] || '3000';
my $buf = undef;
my $sock = IO::Socket::INET->new(
PeerAddr => $addr,
PeerPort => $port,
Proto => 'tcp')
or die "Can't connect: $!\n";
while(1){
$buf = <$sock>;
chomp($buf);
my $bs = length($buf);
print "Received $bs bytes, content [$buf]\n"; # actually get $bs bytes
if($buf eq "CMD")
{
print "the command is CMD \n";
发送数据如何实现?
}
if($buf eq "EXIT")
{
print "get the command EXIT\n";
last;
}
sleep 5;
}
close $sock;
server 代码:
# tcp_iosocket_dt_srv.pl
use strict;
use IO::Socket;
use POSIX qw(WNOHANG);
$SIG = sub {
while((my $pid = waitpid(-1, WNOHANG)) >0) {
print "Reaped child $pid\n";
}
};
my $port = $ARGV[0] || '3000';
my $sock = IO::Socket::INET->new( Listen => 20,
LocalPort => $port,
Timeout => 60*1,
Reuse => 1)
or die "Can't create listening socket: $!\n";
warn "Starting server on port $port...\n";
while (1) {
next unless my $session = $sock->accept;
defined (my $pid = fork) or die "Can't fork: $!\n";
if($pid == 0) {
my $peer = gethostbyaddr($session->peeraddr,AF_INET) || $session->peerhost;
my $port = $session->peerport;
warn "Connection from [$peer,$port]\n";
my $ipadd=inet_ntoa($session->peeraddr);
print "$ipadd\n";
$session->autoflush(1);
print $session "CMD","\n";
while(1)
{
my $test;
#此处接受数据
sysread($sock,$test,4096);
print $test."\n";
print "just for test\n";
chomp($test);
if($test eq "ok")
{
print $session "EXIT","\n";
last;
}
sleep 1;
}
warn "Connection from [$peer,$port] finished\n";
close $session;
exit 0;
}else {
print "Forking child $pid\n";
}
}
close $sock; |
|