这是一个相当复杂的问题,为此我道歉。我写了一个Linux C套接字应用程序,一个简单的聊天服务器的基本框架。服务器正在我的笔记本电脑上运行。客户端是Telnet,直到我写一个指定的客户端应用程序(这将更加安全,希望如此)。我知道,有更好的应用程序可以从客户端发送通用网络数据,但我对为什么在某个Telnet客户端上发生某些事情而不是另一个客户端感兴趣。
第一个Telnet客户端测试是在另一台Linux笔记本电脑上进行的。它按预期工作。然而,下一个是一个名为BBSSH的Blackberry应用程序,允许Telnet和SSH连接。我通过Telnet选项,它也有效。除此之外,它并不完全正确。
服务器代码执行通常的read
调用以检索数据块,该数据块被视为字符串,即消息。前客户端读取,直到我按Enter键,然后它发送一个字符串。然而,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
任何帮助?
答案 0 :(得分:3)
Telnet客户端可以在线路模式或字符模式下运行。由于某种原因,BBSSH客户端似乎在字符模式下运行。
您的服务器可能会通过在telnet连接开始时进行协商期间向客户端发送指令来强制客户端进入线路模式。
您的服务器需要发送到客户端的字节序列是0x255 0x253 0x34,其转换为“解释为命令,执行,线模式”。如果客户端愿意/能够以行模式运行,它应该回复0x255 0x251 0x34(“解释为命令,将,线路模式”)。
如果这对您来说都是新手(即您的telnet服务器目前根本没有进行任何协商),请谷歌查看“telnet negotiation”等术语或查看一些相关的RFCS(RFC 854是Telnet本身,RFC 1184涵盖了Linemode选项。)
答案 1 :(得分:2)
TCP是面向流的,所以没有“消息”这样的东西。您可能会一起收到所有数据,或者一次只收到它的一部分。
在您的情况下,您可能希望缓冲收到的任何内容,直到您点击EOL标记。