Telnet客户端和服务终止的治疗(Telnet Clients and Their Treatme

2019-10-17 02:45发布

这是一个颇为曲折的问题,为此,我很抱歉。 我写了一个Linux下C插座应用,一个简单的聊天服务器的基本框架。 服务器在我的笔记本电脑上运行。 客户端是远程登录的那一刻,直到我写一个指定的客户端应用程序(那将是更安全,希望)。 有来自客户端,我知道发送通用网络数据更好的应用程序,但我有兴趣, 为什么一定的事情发生了一个Telnet客户端而不是另一个上。

第一个Telnet客户端测试在另一台Linux笔记本电脑。 它按预期工作。 接下来,然而,是一个叫BBSSH黑莓应用程序,允许Telnet和SSH连接。 我通过远程登录的选项去了,它也能工作。 除此之外,它不完全是。

服务器代码执行通常的read呼叫检索数据的一个块,这被视为字符串,即一个消息。 前者客户端读取,直到我按下回车键,然后将其发送的字符为一个字符串。 在BB的应用程序,但是,发送仿佛我已经按他们每个人进入后,我没有每一个字符。 显然,这是值得做缓冲,什么某些客户端类作为用户输入一个EOL等我只是不能找出它。

为了说明这一点,这里是服务器输出它从客户端接收的讯息。

首先,从Linux客户端的消息:

client name: this is a test

现在,BBSSH:

client name: t
client name: h
client name: i
client name: s
client name:
client name: i
client name: s
client name:
client name: a
client name:
client name: t
client name: e
client name: s
client name: t

任何帮助吗?

Answer 1:

Telnet客户端可以在在线模式或字符模式下运行。 该BBSSH客户似乎是在字符模式因某种原因运行。

这有可能是您的服务器可以通过在客户端发送到效果的指令,在telnet连接的开始发生在协商过程中强制客户端进入行模式。

你的服务器将需要发送给客户端的字节序列是0x255 0x253 0x34,意为“解释为命令,执行,LINEMODE”。 如果客户愿意/能够行模式来操作,它应该回复0x255 0x251 0x34(“解释为命令,威尔,LINEMODE”)。

如果这是所有新的给你(即你的telnet服务器目前没有做任何谈判可言),谷歌像“telnet协商”条款或看看一些相关的RFC(RFC 854远程登录本身,RFC 1184覆盖LINEMODE选项)。



Answer 2:

TCP是流为导向的,所以有没有这样的事,作为一个“消息”。 你可能会一起接收所有数据,或只是在一个时间吧片段。

在你的情况,你可能需要缓冲收到什么,直到你打一个EOL标记。



文章来源: Telnet Clients and Their Treatment of EOL