Perl 标准数据上的socat阻塞

Perl 标准数据上的socat阻塞,perl,bash,ssl,aix,socat,Perl,Bash,Ssl,Aix,Socat,我在AIX主机myscript.sh上有一个bash脚本,如下所示: MODE="$1" if [ "$MODE" == "start" ]; then socat -T100 -lf $LOGF -d -d -d -x TCP4-LISTEN:$LISTENINGPORT,bind=$LISTENINGADDR,reuseaddr,fork EXEC:"$0 proxy" & PID=$! echo $PID > $PIDFILE echo "$0

我在AIX主机myscript.sh上有一个bash脚本,如下所示:

MODE="$1"
if [ "$MODE" == "start" ]; then
    socat -T100 -lf $LOGF -d -d -d -x TCP4-LISTEN:$LISTENINGPORT,bind=$LISTENINGADDR,reuseaddr,fork EXEC:"$0 proxy" &
    PID=$!
    echo $PID > $PIDFILE
    echo "$0 $MODE started (pid=$PID)"

elif [ "$MODE" == "proxy" ]; then
    cat - > $TMPFILE
    # process $TMPFILE before the SSL connection.
    cat $TMPFILE | socat -T 100 -lf $LOGF -d - OPENSSL:$HOST
    rm -f $TMPFILE
当我跑步时,一切都很好:

$ cat somefile | myscript.sh proxy | xxd
当我使用测试脚本连接到socat侦听器时,会出现以下问题:

my $file = $ARGV[0];
my $fsize = -s $file;
my $socket = IO::Socket::INET->new("127.0.0.1:$port")
    or die "Couldn't connect to remote host: $!";
$socket->autoflush(1);
binmode($socket);
open (FILE,$file);
binmode(FILE);
my $buffer ;
while(sysread(FILE, $buffer, $blocksize)) {
    print $socket $buffer ;
}
print "sent\n" ;
close (FILE) ;

my $answer = <$socket>;
if (defined($answer)) {
    print $answer; # never reached
print "...\n" ;
} else {
    die "connection reset by peer\n";
}
在测试脚本中,它在行上阻塞:

cat - > $TMPFILE
my $answer = <$socket>;
这很难看,而且浪费了0.2秒,我希望能找到更好的解决方案。
但它现在起作用了。2>/dev/null部分是因为AIX抱怨计数器无效(与超时命令相关)。

我的第一个想法是,您试图使用
cat-
接收的数据中没有换行符。当两个命令都有换行符或文件描述符的缓冲区已满(Linux中默认为4KB)时,它们的默认行为都将返回数据。

这个脚本是用Perl编写的吗?my$answer=(我的$answer=)上的左/右尖括号是什么?另外,在shell脚本中,当您从标准输入(
cat-
)接收数据时,它何时终止?是的,测试脚本是用perl编写的。括号的意思是“读任何可读的东西”,我很乐意读哪怕是一个字节。是的,当测试脚本被终止时,我从stdin那里得到了全部信息;我的第二个问题是,标准输入流何时终止?如果你没有收到一个
EOF
,是的,
cat
将被困在它的执行中——直到你按Ctrl+c,正如你所说。我已经更新了我的帖子,谢谢你的提示,所以经过一段时间的数据接收,你现在真的在杀死
cat-
。数据从何而来,数据发送方自身不能向
cat-
发送终止吗?我的意思是,这是标准输入,但是你在文件中键入内容,还是来自打开的连接?实际上,没有换行符。需要通过SSL传输的是二进制协议聊天。您发送了多少数据?在perl中尝试
read
,长度为1,在这种情况下,它应该返回得非常快。数据量在0.5k到3k之间变化。如何从bash调用“perl-read”?
timeout 0.2 cat -u - > $TMPFILE 2>>/dev/null
# process $TMPFILE before the SSL connection.
cat $TMPFILE | socat -T 100 -lf $LOGF -d - OPENSSL:$HOST