这是我第一次来这里,感谢您阅读我的问题。
我使用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的错误,有没有办法解决这个问题?