Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
服务器无法用perl回复客户端_Perl_Sockets - Fatal编程技术网

服务器无法用perl回复客户端

服务器无法用perl回复客户端,perl,sockets,Perl,Sockets,我正在使用Perl通过套接字编程实现客户机-服务器通信 我正在将一些数据从客户端发送到服务器,但除非使用Ctrl-C终止客户端,否则我无法在服务器上看到任何内容 此外,从服务器返回的任何内容都不会到达客户端 这是我第一次尝试做客户机-服务器编程,但我不知道该做什么 我正在使用这个模块 这是我的密码 服务器 use IO::Socket::INET; my ($socket, $client_socket); my ($peeraddress, $peerport); $| = 1; $so

我正在使用Perl通过套接字编程实现客户机-服务器通信

我正在将一些数据从客户端发送到服务器,但除非使用Ctrl-C终止客户端,否则我无法在服务器上看到任何内容

此外,从服务器返回的任何内容都不会到达客户端

这是我第一次尝试做客户机-服务器编程,但我不知道该做什么

我正在使用这个模块

这是我的密码

服务器

use IO::Socket::INET;

my ($socket, $client_socket);
my ($peeraddress, $peerport);

$| = 1;

$socket = new IO::Socket::INET (
  LocalHost => '127.0.0.1',
  LocalPort => '5000',
  Proto     => 'tcp',
  Listen    => 5,
  Reuse     => 1
) or die "Error in socket creation: $!\n";

while (1) {
  $client_socket = $socket->accept();
  $data = <$client_socket>;
  print "Received from socket is $data\n";
  print "Sending to socket\n";
  $client_socket->send("hello");
}

$socket->close();

我冒昧地猜测是这样的:

$data = <$client_socket>;
$client_socket->send("hello");

print $socket "mailshow 018DB3FCE4";
$socket->recv($data,1024);
服务器: 以及:

my$data=;
打印“从套接字接收的是$data\n”;
打印“发送到套接字\n”;
打印{$client\u socket}“hello\n”;

冒险猜测是这样的:

$data = <$client_socket>;
$client_socket->send("hello");

print $socket "mailshow 018DB3FCE4";
$socket->recv($data,1024);
服务器: 以及:

my$data=;
打印“从套接字接收的是$data\n”;
打印“发送到套接字\n”;
打印{$client\u socket}“hello\n”;

请始终
使用严格的
使用警告
并在变量第一次使用时使用
my
声明变量。您还应该避免使用间接对象表示法,因此
newio::Socket::INET(…)
应该是
IO::Socket::INET->new(…)
。“我们建议您避免使用这种语法,有几个原因”请始终
使用strict
使用warnings
,并在变量第一次使用时使用
my
声明变量。您还应该避免使用间接对象表示法,因此
newio::Socket::INET(…)
应该是
IO::Socket::INET->new(…)
。“我们建议您避免使用这种语法,有几个原因”感谢您的帮助:)我将听取您对良好实践的意见,并将遵循这些意见。另外,使用send/recv仅解决我的问题再次感谢
$|=1
将在当前输出上设置自动刷新-这里是
STDOUT
。最好说出你对
STDOUT->autoflush
$socket->autoflush
的意思。这就需要
IO::Handle
,从v5.14I开始,我就使用
$|=1
,并且我是这样读的
socket->read($data,1024)在客户端上。问题是我无法在
STDOUT
上获取最后几个字节,我认为这是因为我正在将其读入
1024字节的
缓冲区,而且缓冲区未满,客户端等待。但我没有更多的东西要从服务器端发送,所以如何获取最后的几个字节。感谢您的帮助:)我将接受您对良好实践的评论,并将遵循它们。另外,使用send/recv仅解决我的问题再次感谢
$|=1
将在当前输出上设置自动刷新-这里是
STDOUT
。最好说出你对
STDOUT->autoflush
$socket->autoflush
的意思。这就需要
IO::Handle
,从v5.14I开始,我就使用
$|=1
,并且我是这样读的
socket->read($data,1024)在客户端上。问题是我无法在
STDOUT
上获取最后几个字节,我认为这是因为我正在将其读入
1024字节的
缓冲区,而且缓冲区未满,客户端等待。但我并没有更多的东西要从服务器端发送,所以如何获取最后的几个字节。
use strict;
use warnings;

use IO::Socket::INET;
$| = 1;

my $socket = new IO::Socket::INET(
    PeerHost => '127.0.0.1',
    PeerPort => '5000',
    Proto    => 'tcp',
) or die "Error in socket creation : $!\n";

print {$socket} "mailshow 018DB3FCE4\n";
my $data;
$socket->recv( $data, 1024 );
print "Client received: ",$data,"\n";
sleep(5);
$socket->close();
use strict;
use warnings;

use IO::Socket::INET;

$| = 1;
my $socket = new IO::Socket::INET(
    LocalHost => '127.0.0.1',
    LocalPort => '5000',
    Proto     => 'tcp',
    Listen    => 5,
    Reuse     => 1
) or die "Error in socket creation: $!\n";

while (1) {
    my $client_socket = $socket->accept();
    my $data          = <$client_socket>;
    print "Received from socket is $data\n";
    print "Sending to socket\n";
    $client_socket->send("hello");

}

$socket->close();
print {$socket} "mailshow 018DB3FCE4\n";
my $data = <$socket>;
print "Client received: ",$data,"\n";
my $data          = <$client_socket>;
print "Received from socket is $data\n";
print "Sending to socket\n";
print {$client_socket} "hello\n";