【问题标题】:TCP packets sent in a particular sequence are not received accordingly未相应接收以特定顺序发送的 TCP 数据包
【发布时间】:2022-08-18 20:33:25
【问题描述】:

对于在线游戏,我将多个客户端连接到服务器。消息的顺序对于遵守游戏逻辑至关重要。例如,要开始一个新游戏,我希望所有客户首先同意。

问题是我的消息通过了,但我没有以正确的顺序接收它(发送者也是接收者)。

class network : public QTcpSocket

void network::doSend(const MessageType msgType, QString msgReceiver, QString msgText) {
    ...
    if( this->write( msgText.toUtf8() ) != msgText.toUtf8().length() )
        qWarning() << \"Not all data have been sent\";
    this->waitForBytesWritten(5000);
#ifdef QT_DEBUG
    qDebug() << \"sent\" << QVariant::fromValue(msgType).toString() << \"from\" <<     m_sName;
#endif
}

void network::doReadyRead() {
    ...
    case nwSyncNewGame: emit onSyncNewGame(aLastMessage); break;
    ...
#ifdef QT_DEBUG
    qDebug() << \"received\" << aLastMessage[\"MessageType\"].toString() << \"from\" << aLastMessage[\"Sender\"].toString();
#endif
}

发送和接收的消息都在主线程中处理。喜欢:

QObject::connect(m_pNetwork, SIGNAL(onSyncNewGame(QVariantMap)),
                 this, SLOT(doNetworkSyncNewGame(QVariantMap)));

void GamePlay::syncNewGame(QVariantMap aConfig) {
    m_pNetwork->doSend(network::nwPoll, \"group\", \"\");
    ...
    m_pNetwork->doSend(network::nwSyncNewGame, \"group\", configData.join(\"\\a\"));

void GamePlay::doNetworkSyncNewGame(QVariantMap aMsg) {
    emit applyConfig(aMsg);
    emit newGame(aMsg[\"IsLoading\"].toBool());
}
从 \"Scotty\" 发送 \"nwPoll\"
从 \"Scotty\" 发送 \"nwSyncNewGame\"
从 \"Scotty\" 发送 \"nwAnswer\"
从 \"Scotty\" 收到 \"nwSyncNewGame\"
从 \"Scotty\" 收到 \"nwRefresh\"
收到来自 \"Scotty\" 的 \"nwPoll\"

我该去哪里寻找解决方案?

  • 你能打印整个数据包,特别是时间戳吗?
  • * 从 \"Scotty\" 发送 1660546441960 \"nwPoll\" * 从 \"Scotty\" 发送 1660546441961 \"nwSyncNewGame\" * 从 \"Scotty\" 发送 1660546441994 \"nwAnswer\" * 收到 1660546442055 \"nwInformation\"来自 \"Server\" * 从 \"Scotty\" 收到 1660546442103 \"nwRefresh\" * 从 \"Scotty\" 收到 1660546442232 \"nwPoll\" (由于某种原因,在这种情况下并非所有消息都通过,我收到 nwSyncNewGame在任何其他消息之后。)github.com/Scrabble3D/4.0 的完整项目

标签: qt6


【解决方案1】:

将多个包从主线程中的函数发送到以缓冲区结尾的套接字。重构了代码,现在一切都很好。关于立即发送包裹的大量问题在不同的主题中处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 2011-06-25
    • 2011-09-13
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多