perl套接字客户端赢得';无法识别消息的结尾

perl套接字客户端赢得';无法识别消息的结尾,perl,sockets,while-loop,Perl,Sockets,While Loop,我正在运行一个简单的perl套接字客户端,它查询服务器,然后在遇到关键字或短语时尝试关闭套接字 ... local $\ = "\x{0d}"; while($line = <$sock>){ print $line."\n"; last if ($line =~ /C6/); } ... close($sock); 。。。 本地$\=“\x{0d}”; 而($line=){ 打印$行。“\n”; 最后一个if($line=~/C6/); } ... 收盘价($sock);

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

...
local $\ = "\x{0d}";
while($line = <$sock>){
  print $line."\n";
  last if ($line =~ /C6/);
}
...
close($sock);
。。。
本地$\=“\x{0d}”;
而($line=){
打印$行。“\n”;
最后一个if($line=~/C6/);
}
...
收盘价($sock);
我很乐意在(0x0d)或“C6”字符串上终止—它们都会终止消息。我正在用Wireshark监控它,两个触发器都发生在消息的末尾,但我无法中断while循环,无论是中断还是最后一次,也无法打印$line


想法?TIA

我认为问题的根源在于设置了
$\
输出记录分隔符,而不是
$/
输入记录分隔符

因此,您的
正在等待
\n
发生,然后将
$line
传递到循环的其余部分

但如果做不到这一点,还存在缓冲和自动刷新套接字的问题


而且。。。当您说您正在使用wireshark进行监控时,您有多确定这些值是数据包内容有效负载的一部分而不是数据包的一部分?您是否真的在任何时候从服务器收到了作为数据包一部分的
\n

当您收到
C6
而未收到回车(或EOF)时,您不会退出,因为您的代码总是等待回车(或EOF)。修正:


我确实有一个超时,它最终会刷新套接字,但由于这是一个交互式应用程序,我更希望更快地获取数据,但由于偶尔出现服务器通信环境不佳的情况,因此无法缩短好的情况下的超时时间。使用perl v5.18.2当您说“最终刷新套接字”时,您的意思是
$line
确实出现了吗?那么——什么是
$sock
?它是否设置为自动刷新(或者每个预期的
$line
是否以
\n
结尾)。我试过了,结果死于过早的EOF,即使缓冲区很小。(未定义$rv)这意味着在消息结束后(CR或
C6
之后)有东西-哇-太快了!是的,有一个x0D。实际上,一个更明确定义的端点可能是R02…C6\n。不知道“R02…C6\n”是什么意思,但请随意调整它是完整的终止字符串;我突然想到C6可能出现在返回的“自然”数据中。
# 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/^( (?: [^C\x0D] | C (?=[^6]) )*+ (?: C6 | \x0D ) )//xs;
}

die("Premature EOF") if length($buf);