【问题标题】:Negotiating echo with telnet client与 telnet 客户端协商回显
【发布时间】:2018-09-30 03:39:16
【问题描述】:

出于某种原因,我想为标准 Telnet 应用程序创建一个服务器作为客户端连接。我用 C++ 写了一个基本的 TCP 服务器,它的目的是提供一个交互式菜单,所以我必须在我这边设置 ECHO

当客户端连接时,我发送 IAC WILL ECHO 给它,我希望得到 IAC DO ECHO。令我惊讶的是,我得到的是 IAC DO ECHOIAC WON'T ECHOIAC DON'T ECHO。一条一条的三条消息。而且客户端还在自己回响。

我做错了什么?这三个消息是什么意思?

int main() {
    TcpListener tcpListener(10001);  // custom tcp helper library
    auto stream = tcpListener.acceptClient();
    vector<uint8_t> msg = {255, 251, 1}; // send IAC WILL ECHO on start
    stream.writeBytes(msg);
    auto message = stream.readBytes(100);
    while (!message.empty()) {
        for (auto c : message) cout << (int)c << endl; // to see what i'm getting from client
        cout << "length: " << message.size() << "\n";
        stream.writeBytes(message); // echo back
        message = stream.readBytes(100);
    }
    return 0;
}

【问题讨论】:

  • 您使用的是哪个 telnet 客户端?哪个版本的?
  • 哦,欢迎来到 stackoverflow.com。请花点时间阅读the help pages,请take the tourread about how to ask good questions。最后请学习如何创建Minimal, Complete, and Verifiable Example
  • 我用的是ubuntu自带的telnet客户端,不知道怎么查看版本。它没有 -v 选项。
  • 好的,这应该符合标准。如果是 Windows,则可能是另一回事。现在解决您的问题,因为您没有显示您的代码,所以很难说您是否正确实现了 telnet 状态机。如果您不想显示您的代码,那么您至少可以转到 telnet 程序自己的命令提示符并启用一些调试选项吗?按Ctrl-^ 进入命令提示符。然后输入命令set options 以启用选项协商调试,并输入set prettydump 和可选的set debug。您可能需要在命令之间使用Ctrl-^
  • @banasraf • 不要卖空自己。这东西很难。

标签: c++ tcp telnet


【解决方案1】:

我认为我的错误现在可以在我的代码中看到,但我处理了一些更复杂的版本。问题是我回显了来自客户端的所有消息,所以当我发送 IAC WILL ECHO 时,它以 IAC DO ECHO 响应。当我回应它时,客户说它不会这样做,然后发送 IAC DON'T ECHO(以清除我认为的情况)。因此,在 telnet 服务器中,当然要避免此类错误,首先要正确处理协商。

【讨论】:

  • 是的,不要盲目回显客户端发送的所有内容。切勿回显 IAC 命令,私下处理它们,并且仅在对方要求您回显时回显非 IAC 数据。我建议您阅读RFC 857 TELNET ECHO OPTION 了解更多详情。
猜你喜欢
  • 2014-11-17
  • 2018-09-21
  • 2019-03-11
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 2013-02-15
  • 2016-07-02
相关资源
最近更新 更多