Perl 套接字客户端无法识别消息结尾



我正在运行一个简单的perl套接字客户端,该客户端查询服务器,然后一旦遇到了关键字或短语,然后尝试关闭套接字。

...
local $ = "x{0d}";
while($line = <$sock>){
  print $line."n";
  last if ($line =~ /C6/);
}
...
close($sock);

我很乐意在(0x0d)或" C6"字符串上终止 - 他们都终止消息。我正在使用Wireshark进行监视,并且两个触发器都出现在消息结束时,但是我无法脱离时循环,无论是休息还是最后一次,也从未打印过。

想法?tia

您在接收C6时不会退出,而无需收到马车返回(或EOF),因为您的代码始终等待运输返回(或EOF)。修复:

# sysread returns as soon as data is available, so this is a just a maximum.
use constant BLOCK_SIZE => 4*1024*1024;
my $buf = '';
while (1) {
   my $rv = sysread($sock, $buf, length($buf), 4*1024*1024);
   die($!) if !defined($rv);
   last if !$rv;
   process_message($1)
      while $buf =~ s/^( (?: [^Cx0D] | C (?=[^6]) )*+ (?: C6 | x0D ) )//xs;
}
die("Premature EOF") if length($buf);

我认为您的问题的根源是您有$ SET,这是输出记录分离器,而不是$/,而不是输入记录分隔器。

因此,您的while正在等待n发生,然后将$line交给循环的其余部分。

但是,如果不这样做,也存在一个在插座上缓冲和自动涂抹的问题。

和...当您说您正在使用Wireshark进行监视时,您确定这些值是数据包内容有效负载的一部分,而不是数据包的一部分?实际上,您是否在任何时候从服务器发送n

最新更新