与远程登录客户端协商回声

Negotiating echo with telnet client

本文关键字:客户端 协商 回声 登录 程登录      更新时间:2023-10-16

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

当客户端连接时,我发送 IAC 将回显到它,我希望得到 IAC DO ECHO。令我惊讶的是,我得到的是IAC DO ECHO,IAC不会回声,IAC不会回声三条消息一一。并且客户端仍在自行回响。

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

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;
}

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