我如何使用Net :: Telnet只发送一个CR,而不是Perl中的CR NUL?

时间:2015-01-03 00:25:41

标签: perl character-encoding telnet

我需要通过telnet协议与设备通信。事实证明,它不能处理CR-NUL或CR-LF序列作为输出记录分隔符,只能处理直接CR。否则,它会将CR后面的字符解释为属于下一个命令,然后导致错误。所以我将Output_record_separator设置为CR,但随后在通信转储(在Dump_Log中)中看到,不仅发送了CR(0x0d),还发送了CR NUL(0x0d 0x00)。我可以发送单个字符:如果我只发送一个LF,则只发送一个LF(ox0a)。

此代码显示问题:

#!/usr/bin/env perl
use strict;
use warnings;

use Net::Telnet;

my $host = "192.168.2.223";
my $port = 5000;


my $telnet = new Net::Telnet ( 
    Timeout                 => 20, 
    Errmode                 => 'die',
    Port                    => $port,
    Dump_Log                => '/tmp/debug',
    Output_record_separator => "\015",
    Input_record_separator  => "\n\r",
    Prompt                  => '/1_.*0/',
    Binmode                 => 1,
);

$telnet->open($host);
$telnet->put("\015");
$telnet->put("\012");

结果如下:

tail: /tmp/debug: file truncated
> 0x00000: 0d 00                                               ..

> 0x00000: 0a                                                  .

如何让Net :: Telnet只发送CR,而不添加更多内容?

1 个答案:

答案 0 :(得分:1)

Telnetmode设为0。如果Telnetmode打开,则CR转换为CR + 0x00。

来自Net :: Telnet来源:

## Convert all CR (not followed by LF) to CR NULL.
while (($pos = index($$string, "\015", $pos)) > -1) {
$nextchar = substr $$string, $pos + 1, 1;

substr($$string, $pos, 1) = "\015\000"
    unless $nextchar eq "\012";

您可以使用$telnet->telnetmode(...)

打开和关闭模式
  

telnetmode - 关闭/打开telnet命令解释
         $mode = $obj->telnetmode;
         $prev = $obj->telnetmode($mode);

     

此方法控制是否识别和处理数据流中的TELNET命令。 TELNET协议使用数据流中发送的某些字符序列来控制会话。如果您要连接的端口未使用TELNET协议,则应关闭此模式。默认设置为。

     

如果没有给出参数,则返回当前模式。

     

如果$ mode为0,则telnet模式关闭。如果$ mode为1,则启用telnet模式。