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

Tre*_*e77 5 c c++ linux telnet embedded-linux

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

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

telnetd -l /usr/local/bin/PROGA -p 1234
Run Code Online (Sandbox Code Playgroud)

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

在一段随机的时间之后,客户端(使用linux版本的telnet,由以下方式启动:telnet xxx.xxx.xxx.xxx 1234)将无法接收'heartbeat\r \n'

客户看到的数据:

heartbeat  
heartbeat  
heartbeat  
...
heartbeat
[nothing, should have received heartbeat]
[nothing forever]
Run Code Online (Sandbox Code Playgroud)

心跳发送:

result = printf("%s", heartbeat);
Run Code Online (Sandbox Code Playgroud)

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

我已经添加了一个tcdrainfflush,它们都取得了成功,但似乎并没有帮助这种情况.

任何帮助,将不胜感激.

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

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

**更新2:运行netcat而不是telnetd,问题不可重现.

jba*_*low 1

我要做的第一件事就是退出 Wireshark 并尝试查明服务器是否真正发送消息。在服务器和第三方 PC 上运行 Wireshark 会很有帮助。上次心跳有什么不同吗?


编辑。嗯,这是你客户的一个有趣的发现。

似乎有某种终端的东西挡住了。您可能想使用netcat程序而不是 telnetd。netcat 设计用于以原始模式通过 TCP 会话发送任意数据,无需任何特殊格式,并且它能够将任意进程连接到套接字。在 Windows 计算机上,您可以在原始模式下使用 PuTTY 来完成相同的操作。

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