c++ - 使用 QDataStream 或 QTextStream 或两者都不从 tcpsocket 读取文本行?

标签 c++ qt qtcore qtnetwork qiodevice

我正在创建一个简单的 TCP 服务器,并构建了一个槽/函数,用于读取来自 TCP 套接字上的客户端(telnet 连接)的传入文本。我使用了《财富》代码示例来帮助我,但不得不删除 QDataStream,因为它没有按预期工作。

我希望我的 readCommand 函数从 telnet 客户端连接收集传入字符,一旦它找到换行符或返回以从输入缓冲区中删除键入的命令,删除/n 和/r,将其添加到我的字符串列表中( commandList),然后回显命令(单独的函数)。这是我到目前为止所得到的:

void MyServer::readCommand()
{
    inBuffer += tcpSocketPtr->readAll();

    // While newline is present, extract the command
    int nextNewlinePos;
    while ((nextNewlinePos = inBuffer.indexOf('\n')) > -1) {
        commandList << inBuffer.left(nextNewlinePos);
        inBuffer.remove(0,nextNewlinePos);
        // Get rid of /n /r if present somehow
    }
    if (commandList.size() > 0)
    {
        echoCommand();
    }
}

在我开始手动剥离/n 和/r 等之前,我的直觉告诉我有更好的方法来做到这一点。 QTextStream 是正确的选择吗?有人可以提供一个简单的替代方案来替代我想要实现的目标吗?

最佳答案

您可以简单地使用 readLine(...) 变体:

  • qint64 QIODevice::readLine(char * data, qint64 maxSize)

  • QByteArray QIODevice::readLine(qint64 maxSize = 0)

请注意,读取行功能将在您的 QTcpSocket 实例上调用,而不是在 QDataStream 上调用。有关详细信息,请参阅内联文档:

A terminating '\0' byte is always appended to data, so maxSize must be larger than 1. Data is read until either of the following conditions are met: The first '\n' character is read. maxSize - 1 bytes are read. The end of the device data is detected.

这样,您就需要解决这样的问题,并且代码可能会变得更加简单。

还有一个可能有帮助的注释:

bool QIODevice::canReadLine() const [virtual]

基本上,此方法将保证您不会尝试在可用之前运行线路。这在某些情况下可以派上用场。

关于c++ - 使用 QDataStream 或 QTextStream 或两者都不从 tcpsocket 读取文本行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19061252/

相关文章:

C++ SetWindowText 不工作

c++ - STL 删除没有按预期工作?

c++ - 在发出要在程序中使用的命令时如何获取终端的输出?

c++ - 如何在 Qt 中等待线程完成而不阻塞其执行?

c++ - 如何知道何时单击组合框的向下箭头?

c++ - 当按值传递时,包含指针的 QList 将如何表现

c++ - c++11 有类似 quint8 的东西吗?

c++ - x86下划线前缀问题 : Calling NASM function from C++ function works in x64 but fails in x86

c++ - 创建具有均值和标准差的高斯随机发生器

xml - 为什么 Qt 在加载 XML 文件时会丢失我的薄空格 unicode 字符?