由于数据包延迟,QT5 QWebSocket握手失败

时间:2014-12-26 03:59:45

标签: c++ qt websocket qt5

这是我第一次来这里,感谢您阅读我的问题。

我使用QT5.3.2和QWebSocket连接我的服务器,当我的服务器在本地时,一切正常。但是在我尝试连接到任何其他服务器后它无法连接。我找到了为什么,即握手数据包无法正确处理的原因,这里是QT源代码。

void QWebSocketPrivate::processData(){

Q_ASSERT(m_pSocket);
while (m_pSocket->bytesAvailable()) {
    if (state() == QAbstractSocket::ConnectingState)
        processHandshake(m_pSocket.data());
    else
        m_dataProcessor.process(m_pSocket.data());
    }
}

void QWebSocketPrivate::processHandshake(QTcpSocket *pSocket)

{
for(int aa=0;aa<300000000;aa++)
    continue;
......
/*parse packet header & content*/
}

问题是,一旦有可用于在Web套接字中读取的字节,m_pSocket-&gt; bytesAvailable()函数将返回true,即使这些字节只是握手数据包的一部分。例如,握手包看起来像这样(来自wireshark的cpoy)

HTTP/1.1 101 Switching Protocols\r\n
Date: Thu, 18 Dec 2014 09:16:22 GMT\r\n
Upgrade: websocket\r\n
Connection: Upgrade\r\n 
......

当第一行(HTTP / 1.1 ...)被读入Web套接字时,m_pSocket-&gt; bytesAvailable()将返回true,并且将调用processHandshake。但这会导致processHandshake中的数据包解析不完整,因此无法正确设置连接。我的解决方法是在processHandshake的开头添加一个for循环,等待整个数据包被读入Web套接字,这样解析就会成功,连接也会正确设置。

这是否是QT的错误,有没有办法解决这个问题?

0 个答案:

没有答案