telnet客户端连接停止接收数据,服务器仍在发送

时间:2010-06-14 21:56:39

标签: c++ c linux telnet embedded-linux

我在嵌入式Linux环境中工作。

它在启动时启动一个telnet守护程序,它监视特定端口并在收到连接时启动程序。

即。

telnetd -l /usr/local/bin/PROGA -p 1234

PROGA - 将以不规则的间隔输出一些数据。当它没有输出数据时,每隔X段发出一个“心跳”类型字符串,让客户知道我们仍处于活动状态,即“heartbeat \ r \ n”

经过一段随机的时间后,客户端(使用由telnet xxx.xxx.xxx.xxx 1234)启动的linux版telnet将无法接收'heartbeat \ r \ n'

客户看到的数据:

heartbeat  
heartbeat  
heartbeat  
...
heartbeat
[nothing, should have received heartbeat]
[nothing forever]
心跳发送:

result = printf("%s", heartbeat);

检查结果,总是heartbeat的长度。记录到syslog会向我们显示printf()正在以适当的时间间隔成功执行

我已添加tcdrainfflush,这两项都会成功,但似乎无法帮助解决问题。

任何帮助都将不胜感激。

** UDPATE:从服务器端获取了wireshark捕获。很明显,心跳正在不断发送。没有Hicups,没有延迟。但是在客户端发现了一些有趣的东西这个测试用例中的客户端(Ubuntu 9.04上的telnet)似乎突然停止接收心跳(如上所述)。 Wireshark证实了这一点,数据包大幅停顿。好吧,一旦客户端停止接收心跳,按下任何击键(在客户端上)似乎会触发来自客户端缓冲区(所有心跳)的数据。客户端上的Wireshark也会在一个数据包中显示大量数据。

不幸的是,我真的不知道这意味着什么。这是一个线路模式开/关的东西?线路结尾(\ r \ n)非常明显地通过。

**更新2:运行netcat而不是telnetd,问题无法重现。

1 个答案:

答案 0 :(得分:1)

我要做的第一件事就是找出Wireshark并试着找出服务器是否真正发送了消息。在服务器和第三方PC上运行Wireshark是有益的。最后一次心跳有什么不同吗?


编辑。嗯,这对您的客户来说是一个有趣的发现。

似乎在路上有某种终端的东西。您可能希望使用 netcat 程序而不是telnetd。 netcat用于在原始模式下通过TCP会话发送任意数据,没有任何特殊格式,并且它能够将任意进程连接到套接字。在Windows机器上,您可以在原始模式下使用PuTTY来完成同样的事情。

在您的客户端和服务器之间检查与第三方的流量可能仍然值得。内核可能正在优化远程写入网络和内部缓冲数据。这是确保能够看到线路上真正发生的事情的唯一方法。