异步模式下QTcpSocket 丢包问题

g2southpark 2010-05-20 04:45:54
紧急求教个qtcpsocket的问题:
本人写了一个游戏客户端程序,当时考虑到QTcpSocket是可以异步工作的,就将其放在主线程里。最近调试的时候发现,经常有tcp包来了但是,readyRead()信号却没有发射。我用抓包工具检测到server过来的数据包,但是qtcpsocket却始终没有发射相关的信号。
疑问:
1. 难道QTcpSocket真的会丢包吗?
2. 是否应该把QTcpSocket对象放入一个独立的线程 而非 跟UI挤在主线程 ?

请高手解答,不吝感激!!!
下面是通过异步模式从 socket 读入数据的 slot 函数

QObject::connect(m_socket, SIGNAL(readyRead()), this, SLOT(slot_readData()));

void GameAgent::slot_readData()
{
qDebug("readReady: %d bytes available\n",m_socket->bytesAvailable());
qDebug("GameAgent::slot_readData()");
while(m_socket->bytesAvailable())
{

if(m_isBodyRcvd)
{
qDebug("API busy, wait 10ms ...");
QTimer::singleShot(10,this,SLOT(slot_readData()));
return;
}
QDataStream in(m_socket);
in.setByteOrder(KInByteOrder);

if( !m_isBodyRcvd )
{
if (m_inSize == 0)
{
if (m_socket->bytesAvailable() < (int)sizeof(quint16))
return;
in >> m_inSize;
qDebug("m_inSize = %d\n",m_inSize);
}
//wait for adapter id
if(m_inID == 0)
{
if (m_socket->bytesAvailable() < sizeof(m_inID))
return;
in >> m_inID;
qDebug("m_inID = %d",m_inID);
}
//wait for block containing protocol body
if(m_inData.isEmpty())
{
if (m_socket->bytesAvailable() < (m_inSize))
return;
m_inData.reserve(m_inSize);
//in.readRawData(m_inData.data(),m_inSize);
m_inData = m_socket->read(m_inSize);
qDebug("Read %d bytes into m_inData\n",m_inData.size());
Q_ASSERT(m_inData.size() == m_inSize);
}
Q_ASSERT(PT_MAXGAMEMSGLEN + PROTOCOL_MAXSIZE > m_inSize);
m_isBodyRcvd = true;
handleInData(); //deal with the received protocol body

}

}// end while(m_socket->bytesAvailable())
}
...全文
962 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
gemfield 2010-05-21
  • 打赏
  • 举报
回复
下个周末准备整理一下这方面的笔记,楼主可关注一下
  • 打赏
  • 举报
回复
Qt网络部分已经忘光了..帮顶好了

16,199

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧