发送输入到服务器时的Telnet连接和问题

时间:2010-07-05 04:44:39

标签: perl

我使用select编写了服务器程序。然后我使用telnet连接客户端。连接也成功完成。

如果输入长度为6个字符(包括换行符),则在服务器端显示长度为7个字符。怎么可能?

1 个答案:

答案 0 :(得分:1)

服务器端:

客户端正在发送\r\n而不是\n,这将占用额外的字符。您可以使用简单的正则表达式将其转换回新行:

# $data holds the input line from the client.
$data =~ s/\r\n/\n/g;  # Search for \r\n, replace it with \n

客户端:

假设您正在使用Net::Telnet,则可能会按照Telnet RFC的指定为新行\r\n发送2个字符。

我链接的文档说明了这个,

  

在输入流中,每个序列   回车和换行(即   “\ 015 \ 012”或CR LF)转换为   “\ n”。在输出流中,每个   “\ n”的出现转换为a   CR LF序列。请参阅binmode()   改变行为。 TCP协议   通常使用ASCII序列,   回车和换行   指定换行符。

默认情况下不是二进制模式(binmode),这意味着客户端数据中的\n的所有实例在被发送到服务器之前都将被\r\n替换。

  

默认Binmode为0,表示   做换行翻译。

您可以通过在文件描述符上调用binmode来阻止模块替换换行符,或者在Net :: Telnet的情况下,在对象上调用binmode并传递1。

# Do not translate newlines.
$obj->binmode(1);

或者,您可以在服务器上搜索输入数据中的\r\n,并将其替换为\n