【发布时间】:2018-09-30 03:39:16
【问题描述】:
出于某种原因,我想为标准 Telnet 应用程序创建一个服务器作为客户端连接。我用 C++ 写了一个基本的 TCP 服务器,它的目的是提供一个交互式菜单,所以我必须在我这边设置 ECHO。
当客户端连接时,我发送 IAC WILL ECHO 给它,我希望得到 IAC DO ECHO。令我惊讶的是,我得到的是 IAC DO ECHO、IAC WON'T ECHO、IAC 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 tour 和read 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 • 不要卖空自己。这东西很难。