1

这是一个相当复杂的问题,对此我深表歉意。我编写了一个 Linux C 套接字应用程序,这是一个用于简单聊天服务器的基本框架。服务器正在我的笔记本电脑上运行。客户端目前是 Telnet,直到我编写指定的客户端应用程序(希望这会更安全)。我知道,有更好的应用程序可以从客户端发送通用网络数据,但我对为什么某件事发生在一个 Telnet 客户端而不是另一个客户端感兴趣。

第一个 Telnet 客户端测试是在另一台 Linux 笔记本电脑上进行的。它按预期工作。然而,下一个是一个名为 BBSSH 的黑莓应用程序,它允许 Telnet 和 SSH 连接。我通过了 Telnet 选项,它也可以工作。除了,它不完全是。

服务器代码执行通常的read调用来检索数据块,该数据块被视为字符串,即消息。前一个客户端读取直到我按回车键,然后它发送一串字符。但是,BB 应用程序会发送每个字符,就好像我在每个字符之后都按了 Enter 键一样,而我没有。显然,这与缓冲有关,某些客户端从用户输入中将其归类为 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

有什么帮助吗?

4

2 回答 2

3

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

在 telnet 连接开始时发生的协商期间,您的服务器可能会通过向客户端发送相关指令来强制客户端进入线路模式。

您的服务器需要发送给客户端的字节序列是 0x255 0x253 0x34,翻译为“解释为命令、执行、行模式”。如果客户端愿意/能够在线路模式下操作,它应该回复 0x255 0x251 0x34(“解释为命令,意志,线路模式”)。

如果这对您来说是全新的(即您的 telnet 服务器目前根本不进行任何协商),请在谷歌上搜索“telnet 协商”之类的术语或查看一些相关的 RFCS(RFC 854 是 Telnet 本身,RFC 1184涵盖 Linemode 选项)。

于 2012-07-30T14:57:12.683 回答
2

TCP 是面向流的,因此不存在“消息”之类的东西。您可能会一起接收所有数据,或者一次只接收其中的一部分。

在您的情况下,您可能希望缓冲收到的任何内容,直到您遇到 EOL 标记。

于 2012-07-30T14:42:20.370 回答