我的client.pl
#!/usr/bin/perl
use IO::Socket::INET;
use strict;
my $name = '172.20.10.189'; #Server IP
my $port = '7890';
my $socket = IO::Socket::INET->new('PeerAddr' => $name,
'PeerPort' => $port,
'Proto' => 'tcp') or die "Can't create socket ($!)\n";
print "Client sending\n";
while (1) {
my $msg = <STDIN>;
print $socket $msg;
print scalar <$socket>;
}
close $socket
or die "Can't close socket ($!)\n";
我的server.pl
#!/usr/bin/perl
use IO::Socket::INET;
use strict;
my $port = "7890";
my $socket = IO::Socket::INET->new('LocalPort' => $port,
'Proto' => 'tcp',
'Listen' => SOMAXCONN)
or die "Can't create socket ($!)\n";
while (my $client = $socket->accept) {
my $name = gethostbyaddr($client->peeraddr, AF_INET);
my $port = $client->peerport;
while (<$client>) {
print "[$name $port] $_";
my @out = `$_`;
print @out;
print $client "$.: @out";
}
close $client
or die "Can't close ($!)\n";
}
die "Can't accept socket ($!)\n";
我的客户端正在向服务器发送命令(ls -lrt /),而Server应该运行该命令并将输出发送回客户端。
问题: -
该命令在服务器上成功执行,但它只向客户端发送第一行。如果我再次从客户端按任意键,则下一行输出将发送到客户端。
或者告诉我如何将多行输出发送回客户端。
任何帮助都将不胜感激。
由于 阿布舍克
答案 0 :(得分:2)
服务器将所有行发送到客户端,然而客户端选择只读取一行:
print scalar <$socket>;
如果删除scalar
,它应该有效。 但是,您的架构仍然是一场安全噩梦。
-T
开关)运行。答案 1 :(得分:0)
这是一个愚蠢的错误......我已经修复了第一个问题如下并在客户端获得了多行输出......
#!/usr/bin/perl
use IO::Socket::INET;
use strict;
my $name = '172.20.10.189'; #Server IP
my $port = '7890';
my $socket = IO::Socket::INET->new('PeerAddr' => $name,
'PeerPort' => $port,
'Proto' => 'tcp')
or die "Can't create socket ($!)\n";
print "Client sending\n";
while (1) {
my $msg = <STDIN>;
print $socket $msg;
while (<$socket>)
{
print "\n$_";
}
}
关闭$ socket 或死“无法关闭套接字($!)\ n”;
但还有一个问题 -
我希望我的客户端一个接一个地发送一些其他命令,直到我手动关闭客户端并接收输出。
问题是 - 它仅接收第一个命令的输出..
现在有人可以帮我吗?