• 4163阅读
  • 2回复

qt 在接收两个基本上同时到来的数据时怎么办? [复制链接]

上一主题 下一主题
离线yu1121jm
 
只看楼主 倒序阅读 楼主  发表于: 2012-04-04
qt 在接收两个基本上同时到来的数据时怎么办?
1. 两个数据一起接收? 我用了blockSize 控制接收大小,接收完后把blockSize=0。 这样如果我接收到了第一个接收到的数据,在清零前第二个数据有到了,那么会怎么办?
2. qt 的tcpSocket 接收数据时,有没有什么队列,会把第二个放在队列里面,等第一个接收玩,再接收第二个?
3. 我没有写多线程,请问怎么解决这个问题
离线ninsun

只看该作者 1楼 发表于: 2012-04-05
很遗憾...似乎没有内置的解决方案
当两个数据同时到来的时候, 你应该只会收到一个包... 并且,这一个包包含了两个数据....(当然, 还有可能是一个半数据...)
多线程似乎也解决不了这个问题
你需要自己定义一种数据传输协议来处理这种问题.
离线ninsun

只看该作者 2楼 发表于: 2012-04-05
附上我自己的处理函数, 包括发送与接收
  1. void send( const QByteArray& data )
  2. {    
  3.     QMutexLocker _locker(&m_mutex);
  4.     if(m_pSocket && m_pSocket->isOpen() && !data.isEmpty())
  5.     {
  6.         QByteArray _msg = qCompress(data, 9);
  7.         // 在压缩的数据前附加上压缩的数据的长度
  8.         unsigned char _a = (_msg.length()&0xFF000000) >> 24;
  9.         unsigned char _b = (_msg.length()&0xFF0000) >> 16;
  10.         unsigned char _c = (_msg.length()&0xFF00) >> 8;
  11.         unsigned char _d = (_msg.length()&0xFF);
  12.         _msg.prepend(_d);
  13.         _msg.prepend(_c);
  14.         _msg.prepend(_b);
  15.         _msg.prepend(_a);
  16.         m_pSocket->write(_msg);
  17.         m_pSocket->flush();
  18.     }
  19. }
  20. void onConnectionReadyRead()
  21. {
  22.     QByteArray _buffer = m_pSocket->read(m_pSocket->bytesAvailable());
  23.     // 取得数据, 判断是否拥有数据长度信息(有则表示是新的数据)
  24.     m_tmpData.append(_buffer);
  25.     do
  26.     {
  27.         if (m_length == 0)  // 无数据长度
  28.         {
  29.             if (m_tmpData.length()>=4)
  30.             {
  31.                 unsigned int _a = (unsigned char)m_tmpData.at(0);
  32.                 unsigned int _b = (unsigned char)m_tmpData.at(1);
  33.                 unsigned int _c = (unsigned char)m_tmpData.at(2);
  34.                 unsigned int _d = (unsigned char)m_tmpData.at(3);
  35.                 // 获取数据长度
  36.                 m_length = (_a << 24) + (_b << 16) + (_c << 8) + _d;
  37.                 // 将数据长度从数据之中移除(只保留压缩后的数据)
  38.                 m_tmpData = m_tmpData.mid(4);
  39.             }
  40.             else
  41.             {
  42.                 return;
  43.             }
  44.         }
  45.         // 判断数据是否已经完整
  46.         if (m_tmpData.length() >= m_length)
  47.         {
  48.             // 获取完整的数据
  49.             _buffer = m_tmpData.left(m_length);
  50.             // 将剩余的数据继续保留(防止粘包)
  51.             m_tmpData = m_tmpData.mid(m_length);
  52.             // 将数据长度清空()
  53.             m_length = 0;
  54.         }
  55.         else
  56.         {
  57.             return;
  58.         }
  59.         try
  60.         {
  61.             _buffer = qUncompress(_buffer);
  62.         }
  63.         catch(...)
  64.         {
  65.             continue;
  66.         }
  67.         QString _msg = QString::fromUtf8(_buffer.data());
  68.         if(!_msg.isEmpty())
  69.         {
  70.         // 处理数据
  71.         }
  72.     } while (!m_tmpData.isEmpty());
  73. }


快速回复
限100 字节
 
上一个 下一个