处理 Telnet 协商

6

我正在尝试使用C++和QT作为GUI实现Telnet客户端。但我不知道如何处理telnet的协商过程。每个telnet命令都以IAC开头,例如:

IAC WILL SUPPRESS_GO_AHEAD

以下是我的协商过程:

  1. 在接收缓冲区中搜索IAC字符
  2. 根据命令和选项,响应请求

我的问题描述如下:

  1. 似乎telnet服务器在发送协商命令后不会等待客户端响应。例如(发送两个或多个命令而不等待客户端响应)
  2. IAC WILL SUPPRESS_GO_AHEAD

    IAC WILL ECHO

我应该如何处理这种情况?处理两个请求还是只处理最后一个请求?

  1. 如果我不响应请求,选项值会是什么?它们会被设置为默认值吗?
  2. 为什么IAC字符(255)不被视为数据而是命令?
1个回答

6

是的,允许发送多个谈判请求以获取不同的选项,而不需要在每个请求后同步等待响应。实际上,对于每一方来说都很重要,即使它没有收到回复也要尝试继续(可能在等待一段时间后),因为根据RFC中的合法情况,有些时候不能或者不必回复,而且对方可能会忽略请求,你无法控制这种情况。需要考虑服务器发送的两个谈判请求,因为它们都是有效的请求(当然你可以选择拒绝一个或两个)。建议您在注意到它们时立即处理它们(在您的情况下,“处理”意味着什么),以免如果服务器决定等待您的回复而导致服务器卡住。Daniel J. Bernstein在RFC 1143 中提出了一种可能的方法。它使用有限状态机(FSM)并且非常强大,可以避免谈判循环。
符合规定的服务器(客户端同理)在连接开始时将所有可谈判的选项默认设置为 WON'T DON'T (即禁用),直到通过 DO WILL 请求并得到 WILL DO 回复才将其视为启用。当然,并不是所有服务器(或客户端)都能正确地工作,但你无法预测同行可能的所有错误行为,因此只需假设所有选项都被禁用,直到请求启用它们并且回复是积极的。
我假设您实际上正在问的是如何在不将其误解为 IAC 控制序列的情况下,服务器将一个255字节作为数据发送给您(反之亦然,您应该如何将255字节作为数据发送给服务器而不会将其误解为telnet命令)。答案很简单,服务器(以及相反方向的客户端)发送 IAC 后跟另一个255字节,因此实际上将数据流中的所有255值加倍。在接收到网络上传输的 IAC 和255后,您的客户端(以及相反方向的服务器)必须用单个数据字节255替换它所返回的数据流中的内容。这也在RFC 854中有所涉及。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接