【问题标题】:Qt endl looks great from linux telnet, wrong from windows telnetQt endl 从 linux telnet 看起来很棒,从 windows telnet 看错了
【发布时间】:2013-10-05 23:02:52
【问题描述】:

我正在 Qt 中构建一个 telnet 服务器应用程序,当我从 linux telnet 客户端连接时,输出看起来很棒。例如,向我的控制台发送 "A"

A
B
C

现在,当我从 Windows telnet 客户端连接时,我看到了

A
 B
  C

显然 Qt 的 endl 只发送 '\n'。有一个简单的解决方案吗?如果我用“\r\n”替换endl,我现在会搞乱linux客户端吗?我也必须强制冲洗吗?

这是我用来发送到我的 telnet 客户端的实际代码:

QString block;
QTextStream out(&block, QIODevice::WriteOnly);
out << "Valid commands are: " << endl
    << "  help         Print this list" << endl
    << "  version      Print this version" << endl
    << "  clientcount  Show the number of active telnet clients" << endl
    << "  logrotate    Rotate the event log file" << endl
    << "  shutdown     Initiate shutdown secast" << endl
    << "  quit         Disconnect your telnet session" << endl
    << "  stop         Shutdown secast" << endl;
tcpSocketPtr->write(block.toUtf8());

【问题讨论】:

    标签: qt qstring qtcpsocket qtnetwork qtcore


    【解决方案1】:

    您可以简单地将QTextStream 删除并直接在此处写入QString

    QString block = QString("Valid commands are: \n")
                + "  help         Print this list\n"
                + "  version      Print this version\n"
                + "  clientcount  Show the number of active telnet clients\n"
                + "  logrotate    Rotate the event log file\n"
                + "  shutdown     Initiate shutdown secast\n"
                + "  quit         Disconnect your telnet session\n"
                + "  stop         Shutdown secast\n";
    
    tcpSocketPtr->write(block.toUtf8());
    

    根据您的评论,您似乎使用了一些旧的 DOS 客户端(在 Windows 上!),它需要“\r\n”。在这种情况下,我会为此发送“\r\n”,但对于 Linux,只发送通常的“\n”。在 Linux 上发送回车并不是一个很好的做法,而不仅仅是换行,即使 "\r\n" 在 Linux 上似乎也可以工作。

    【讨论】:

    • @Michelle:你之前没有提到过一些旧的dos。现代系统仅适用于“\n”。顺便说一句,你不应该在 Linux 上发送 \r\n。确保您在代码中进行了正确的分支并定义了您自己的 endl。顺便说一句,我更新了我的回复以反映这一点。
    • Windows 7 的 telnet 客户端只有 \n 有问题(它需要 \r\n),但 Fedora 18 的 telnet 似乎没问题,每行末尾都有 \r\n(似乎忽略 \r)。所以我认为这样做没有风险。我读到将 endl 发送到流会导致刷新,所以我也添加了刷新
    • @Michelle:它可能会导致额外的字符,这可能会混淆另一端。如果您只是在寻找一种快速的解决方法,那么尽管它不是一个精确的解决方案,但它确实可以正常工作。
    • @Michelle:是的,我在评论中写道。用 platorm ifdefs 包围你自己的“endl”。
    • Ifdefs 仅适用于已编译的平台...所以在 linux 上编译我会使用 \n。但是客户端可以是 Linux 或 Win,这是我遇到的问题。我想我会结束这个问题......不确定是否有更好的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2017-11-30
    • 2011-04-18
    相关资源
    最近更新 更多