c - 通过半双工通信链路的 Telnet - 协商参数

标签 c embedded telnet legacy obsolete

我们的嵌入式系统需要一个 Telnet(通过串行)接口(interface),由于硬件/遗留系统它在半双工链路 (RS485) 上工作。是的,我知道 - 不,我们不能改变它,业界喜欢这样。

问题在于,当我们向终端发送一整屏文本时,用户可以按下按钮并将数据发送回网络。

Telnet 支持 IAC->GA(Go Ahead)命令向用户终端发出信号,它可以开始发送数据,但在我读过的任何 RFC 中都没有任何信息告诉用户终端停止发送数据,以便我们刷新屏幕。

不幸的是,大约 1973 年之后的所有 RFC 都假设将使用 SGA ( Suppress Go Ahead ) 模式,因此它很少被提及。不幸的是,似乎没有一个 RFC 或其他文档真正涵盖了整个协议(protocol)。

有没有人有任何信息/链接更完整地记录 telnet 协议(protocol)(或只是 Go Ahead 行为)?我意识到其中一些可能写在带有绿色条纹的羊皮纸上 ;)

重新编辑:为什么这个编程问题“离题”了?您知道,Telnet 是 OSI 模型的第 7 层...

最佳答案

啊……RS-485……我记得很清楚! :-)

GA 定义已损坏(参见 https://www.rfc-editor.org/rfc/rfc596)但对于串行线路实现应该没问题,因为没有数据包分解。

您要求的是“反向中断”:

"Reverse break" is a means by which a computer connected to a terminal by a half-duplex path may regain control of the path for further typeout after previously having relinquished it.

就其本质而言,“中断”(反向或其他方式)必须在半双工连接的带外,因为它需要能够随时发送。

编辑:作为聊天结果的新信息:但是,如果您不希望中断实际传输(RFC393,反向中断案例“b”)除了实际传输时,带有 go-ahead token 的一侧不会将硬件切换到“传输”模式(RS-485 在这种模式下无法接收,即使没有数据正在发送) 偶尔损坏/截断的传输是可以容忍的并且 telnet 程序正确地实现了这个相当不寻常的极端情况,然后在带内发送此代码可能是可以接受的。

我认为处理这个问题的另一种方法是破解客户端 Telnet 程序以定期向服务器发送“继续”数据包,即使它没有其他要发送的数据包。这将允许服务器进行更新并作为返回“继续”;它有点像“ token 环”。您甚至不必延迟 - 当收到“继续”时,发送所有未决数据(可能没有)然后返回“继续”。

可能的替代解决方案:

既然您也控制 ser->ip 设备,为什么不在服务器和设备之间简单地使用专门的协议(protocol)呢?

  • 服务器发送STX数据流ETX

  • 客户端发送STX数据流ETX

  • 立即重复

如果任何一方的数据缓冲区中都没有数据,那么它只是一个 STX ETX 对,有效地告诉另一方“继续”。如果在 250ms 内对方没有任何消息,则重新发送 ETX

您甚至可以通过使用 NAK(而不是 STX ...)将 STX 数据流 ETX CRC1 CRC2 扩展到错误检测>) 在检测到错误的情况下回复,并导致重新传输整个最后一个数据包。

关于c - 通过半双工通信链路的 Telnet - 协商参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12839485/

相关文章:

bash - BASH中不可见的无效字符

Java netty客户端无法向服务器发送消息,但telnet到服务器正常

javascript - 使用Node.js打开23端口读取数据

c - 如何在不触发警告的情况下将整数值转换为指针地址

c - 在 C 中为结构类型分配内存

c - 关于消除C语言中内联函数的指针操作的编译器优化?

c - 无法运行编译后的文件 - bash : ./a.out : Permission denied.(我试过 chmod)

c - 如何在 sdcc 内联汇编中推送变量?

jvm - JRE 架构依赖项(在 MIPS 上运行)

linux - SNMP 代理所需的 MAU 数据