Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Telnet客户端及其EOL的处理_C_Sockets_Networking_Blackberry_Telnet - Fatal编程技术网

C Telnet客户端及其EOL的处理

C Telnet客户端及其EOL的处理,c,sockets,networking,blackberry,telnet,C,Sockets,Networking,Blackberry,Telnet,这是一个相当复杂的问题,为此我道歉。我编写了一个LinuxC套接字应用程序,这是一个简单的聊天服务器的基本框架。服务器正在我的笔记本电脑上运行。在我编写一个指定的客户端应用程序之前,客户端目前是Telnet(希望这样会更安全)。我知道,有更好的应用程序可以从客户端发送通用网络数据,但我对为什么某件事情发生在一个Telnet客户端上而不是另一个客户端上很感兴趣 第一个Telnet客户端测试是在另一台Linux笔记本电脑上进行的。它按预期工作。然而,下一个是一个名为BBSSH的黑莓应用程序,它允许T

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

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

服务器代码执行通常的
read
调用来检索数据块,该数据块被视为字符串,即消息。前一个客户端一直读取,直到我按enter键,然后它发送一个字符串。然而,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

有什么帮助吗?

TCP是面向流的,因此没有“消息”这样的东西。您可以同时接收所有数据,也可以一次只接收一部分数据


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

TCP是面向流的,因此没有“消息”这样的东西。您可以同时接收所有数据,也可以一次只接收一部分数据


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

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

在telnet连接开始时进行的协商过程中,服务器可能会向客户端发送一条指令,从而强制客户端进入线路模式

服务器需要发送到客户端的字节序列是0x255 0x253 0x34,翻译为“解释为命令、Do、Linemode”。如果客户机愿意/能够在line模式下操作,则应回复0x255 0x251 0x34(“解释为命令,威尔,Linemode”)


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

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

在telnet连接开始时进行的协商过程中,服务器可能会向客户端发送一条指令,从而强制客户端进入线路模式

服务器需要发送到客户端的字节序列是0x255 0x253 0x34,翻译为“解释为命令、Do、Linemode”。如果客户机愿意/能够在line模式下操作,则应回复0x255 0x251 0x34(“解释为命令,威尔,Linemode”)


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

我的意思是“消息传递”是我的应用程序的一个抽象概念,我知道它都是基于流和缓冲区的。我假设read会一直阻塞直到接收到EOF,填充缓冲区直到达到该点?默认情况下,使用TCP套接字,
read
只是阻塞直到某些数据(任何数据)可用。这可能是一个字节,也可能是一整行。啊,我明白了。这让我很困惑。那么,当数据可用时,read如何知道在停止之前要读取多少字节呢?它可能会在任何数据可用时立即返回-如果您一次获得整行数据,那么您就很幸运了,并且您很可能同时获得半行或两行数据。您必须不断调用
read
,并在接收到的数据中查找下线标记。是的,但即使这样,您也不能保证在客户端发送后这些行不会被分割。我的意思是“消息传递”作为我的应用程序的一个抽象概念,我知道它都是基于流和缓冲区的。我假设read会一直阻塞直到接收到EOF,填充缓冲区直到达到该点?默认情况下,使用TCP套接字,
read
只是阻塞直到某些数据(任何数据)可用。这可能是一个字节,也可能是一整行。啊,我明白了。这让我很困惑。那么,当数据可用时,read如何知道在停止之前要读取多少字节呢?它可能会在任何数据可用时立即返回-如果您一次获得整行数据,那么您就很幸运了,并且您很可能同时获得半行或两行数据。您必须不断调用
read
并在接收到的数据中查找下线标记。是的,但即使这样,您也不能保证在客户端发送后,这些行不会被分割。啊。。。我怀疑这与两个客户机以不同的配置或模式运行有关。这种行为似乎过于一致,不可能是服务器端读取量的侥幸。鉴于Telnet客户端仅仅是一个测试平台,并且客户端最终将直接使用TCP,我将仅暂时嵌入该模式字节序列。感谢RFC编号,我将查找:)即使客户端以完整的行发送数据,它是否仍然容易受到TCP碎片的影响?@JamesMcLaughlin是的,您仍然可以获得TCP级别的碎片,但这不是原因