Perl 标准数据上的socat阻塞
我在AIX主机myscript.sh上有一个bash脚本,如下所示: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
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