1

我正在创建一个简单的 TCP 服务器,并构建了一个插槽/函数,它从 TCP 套接字上的客户端(telnet 连接)读取传入的文本。我使用了 Fortune 代码示例来帮助我,但不得不删除 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 是要走的路吗?有人可以提供一个简单的(r)替代我想要实现的目标吗?

4

1 回答 1

1

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

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

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

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

终止的 '\0' 字节始终附加到数据,因此 maxSize 必须大于 1。读取数据直到满足以下任一条件: 读取第一个 '\n' 字符。maxSize - 读取 1 个字节。检测到设备数据的结束。

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

另一个可能有帮助的注意事项:

bool QIODevice::canReadLine() const [virtual]

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

于 2013-09-27T22:53:48.000 回答