我使用select编写了服务器程序。然后我使用telnet连接客户端。连接也成功完成。
如果输入长度为6个字符(包括换行符),则在服务器端显示长度为7个字符。怎么可能?
答案 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
。