Perl 代码使用 IO::SELECT 和 IO::Socket::UNIX 退出而没有错误,但使用 NETCAT (nc) 没有退出,为什么?



(对我来说(PERL在没有错误的情况下崩溃了,但(对我而言(我一定做错了什么。一切看起来都很奇怪,因为PERL在没有错误的情况下退出中间代码,它不应该。。。除非我错了。。。我可能是…这就是为什么我请求帮助!

我已经确认,下面的代码显示出与原始CENTOS8(我使用的是Rocky(系统相同的行为,并且它EXITS。。。请有人帮我解释一下为什么我真的不知道发生了什么,所以我请求帮助!

两个简单的PERL程序:

./listen_socket.pl
./send_socket.pl sending_this

发送套接字实际上是一个简单的netcat。。。nc

NETCAT工作。。。。如果我使用:

echo send_this | nc -U /tmp/whydontyouwork.sock

那么";listen_socket.pl";未退出,并且行为符合预期。如果我执行这个:

./send_socket.pl send_this

那么它就失败了。

我不明白为什么。请帮帮我,告诉我哪里是白痴,因为我不知道

下面是两个perl程序:(listen_socket.pl(和(send_socketpl(

listen_socket.pl:

use warnings;
use IO::Select;
use IO::Socket::UNIX;
my $SOCK_PATH   = "/tmp/whydontyouwork.sock";
my $socket;
my $sel         = IO::Select->new();
unlink $SOCK_PATH;
setup();
main();
print STDERR "I know I never get here...see below..n";

sub setup {
$socket = new IO::Socket::UNIX(
Type   => SOCK_STREAM,
Local  => $SOCK_PATH,
Listen => 5,
);
$sel->add($socket);
}
sub main {
while ( 1 == 1 ) {
while(my @ready = $sel->can_read(1)) {
foreach my $fh (@ready) {
if($fh == $socket) {
# Create a new socket
my $new = $socket->accept;
$sel->add($new);
}
else {
# Process socket
if ( 1 == 1 ) {
my $data = <$fh>;
if ( defined $data ) {
print STDERR "I am here...I GET HERE!!";
print $fh "n";
print STDERR "..and all done and I NEVER GET HERE!!??.n";
$sel->remove($fh);
$fh->close;
}
}
print STDERR "Howdie here?   Nope..n";
}
}
}
}
}

send_socket.pl:

#!/usr/bin/perl
use Socket;
my $SOCK_PATH = "/tmp/whydontyouwork.sock";
if ( $ARGV[0] ) {
socket(CLIENT, PF_UNIX, SOCK_STREAM, 0);
connect(CLIENT, sockaddr_un($SOCK_PATH));
print CLIENT $ARGV[0] ;
close CLIENT;
exit;
}
exit 1;

WORKS==>
echo send_this | nc -U /tmp/whydontyouwork.sock无效===>perl ./send_socket.pl send_this

您应该添加每次运行的输出,至少告诉我们侦听器死于Broken pipe,这会让您的问题更加明显。

在任何情况下,看起来发送方正在关闭套接字,然后侦听器正在尝试对其进行写入

从技术上讲,您可以忽略断开的管道,并通过向侦听器添加$SIG{PIPE} = 'IGNORE';使perl示例的输出相同,但这当然不能解决(缺乏(逻辑的问题。

但是,实际上,你应该多读一些关于使用套接字编程的知识,因为你试图做的事情没有多大意义,更重要的是,你实际上应该注意错误消息,以获得正在发生的事情的提示。

相关内容

最新更新