Qt套接字没有等待写入的字节

时间:2015-04-26 22:23:12

标签: c++ qt networking tcp

我写了一个国际象棋客户端/服务器移动应用程序,并且有一个远程服务器已经在西海岸,东海岸之间进行了测试,等等。程序简而言之:

1.  Log in to remote server with correct username/password via iOS/Android or Windows desktop.
2.  Enter queue for a 1-minute, 5-minute or 30-minute game of chess.
3.  Wait for another opponent to join queue.
4.  Get matched and play game of chess.
5.  When game is over, log out or play more chess.

然而,当我通过学校的互联网登录服务器时,我遇到了最奇怪的错误。这是如此奇怪,因为它只是我连接的许多ISP中存在问题的唯一ISP。

当我通过学校的互联网登录服务器时,我将从套接字中收到以下错误和errorString。

QAbstractSocket::UnknownSocketError "Unknown error"

在我的应用程序中生成它的步骤是:

1. Enter username and password, log into server. (Successfully completes this).

2. Click to join a queue for a game of chess.  (Successfully writes to socket, but fails to wait for bytes written then emits the above error and error string.

我检查了服务器,甚至没有调用readyRead(),所以我知道客户端没有向服务器发送任何内容。

有趣的是,我找到了解决此错误的解决方法。

1.  Click on Settings page.
2.  Click Save. (Does the exact same thing as I try to do above.  Write to socket, flush and wait for bytes written).
3.  Join queue (Successfully joins queue).

变通方法没有任何感觉因为它没有做我上面尝试的任何不同的事情(写入套接字,刷新并等待写入的字节)。

有没有人知道可能发生的事情?

  1. 为什么此错误特定于一个互联网位置?我的学校互联网很慢,但没有解释为什么套接字在下面的功能中立即断开。
  2. 为什么我的解决方法有效?
  3. 如何更多地了解我的问题(即愚蠢的错误消息......"未知错误")。
  4. 不仅如此,当我右键单击下面的功能时,再单击“查找用法”,将显示构建文件夹。这是程序中唯一执行此操作的功能。 WTF ???
  5. 此功能中的套接字断开连接。

     void CG_serverConnection::sendQueueType(int timeControl)
     {
        //Create local JSON object
        QJsonObject userInfo;
    
        //Create object
        userInfo["PacketHeader"] = QUEUE_REQUEST;
        userInfo["TimeControl"] = timeControl;
    
        //Create JSON document
        QJsonDocument doc;
        doc.setObject(userInfo);
    
        qDebug() << "Send queue type called! ";
        qDebug() << doc.toJson();
    
        QByteArray byteArray = doc.toBinaryData();
    
        //Send over socket
        if(m_socket->write(byteArray))
        {
            qDebug() << "Wrote to socket";
        }
        else
            m_socket->errorString();
        if(m_socket->flush())
        {
            qDebug() << "Flushed";
        }
        else
            qDebug() << m_socket->errorString();
    
        if(m_socket->waitForBytesWritten(50000))
        {
            qDebug() << "Bytes were written.";
        }
        else
        {
           qDebug() << m_socket->error();
           qDebug() << m_socket->errorString();
        }
    }
    

    我在哪里调用该功能

        Button
        {
            id: btn_oneMinuteGame
            text: "One Minute"
            style: cgButtonStyle
    
            Layout.alignment: Qt.AlignCenter
            Layout.preferredWidth: Lobby.getControlWidth()
            Layout.preferredHeight: Lobby.getControlHeight()
    
            onClicked:
            {
                ServerConnection.sendQueueType(1) // TODO : Magic numbers
                root.startOneMinuteGame()
            }
        }
    

1 个答案:

答案 0 :(得分:0)

出于某种原因,如果我在我的函数顶部调用它,一切正常......

没有任何意义。如果有人可以解释为什么会这样,或者你有其他解决方案,请发布。

//Temporary bug fix
this->sendUpdatedUserInfo();

功能我称之为某种方式使一切正常

void CG_serverConnection::sendUpdatedUserInfo()
{
    QJsonObject request;

    request["PacketHeader"] = UPDATE_INFO;
    request["loggedIn"]     = m_player.loggedIn;
    request["banned"]       = m_player.banned;
    request["username"]     = m_player.username;
    request["elo"]          = m_player.elo;
    request["countryFlag"]  = m_player.countryFlag;
    request["pieceSet"]     = m_player.pieceSet;
    request["language"]     = m_player.language;
    request["sound"]        = m_player.sound;
    request["coordinates"]  = m_player.coordinates;
    request["arrows"]       = m_player.arrows;
    request["autoPromote"]  = m_player.autoPromote;
    request["boardTheme"]   = m_player.boardTheme;

    QJsonDocument doc;
    doc.setObject(request);

    qDebug() << "Updated userInfo being sent: ";
    qDebug() << doc.toJson();

    m_socket->write(doc.toBinaryData());
    m_socket->flush();
    m_socket->waitForBytesWritten();
}