首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

Qt write and read,该如何解决

2013-01-08 
Qt write and read用Qt和Linux下服务器TCP通信。附上发送函数void MySocket::subpackage()//类似分包 {int

Qt write and read
用Qt和Linux下服务器TCP通信。
附上发送函数


void MySocket::subpackage()//类似分包
 {
    int sendNUmber = m_strMsgType.len;
    int serial_number = sendNUmber/MAXDATASEND; //     总点集/一次发送的字节
    int i = 0;
    for(; i<serial_number; i++)多次发送
    {
        char array[1265] = {0};
        m_strMsgType.len = MAXDATASEND;
        memcpy(array,&m_strMsgType,HEDERLEN);//拷贝数据包头到array
        memcpy(array+HEDERLEN,m_pSendDatabuf+i*MAXDATASEND,MAXDATASEND*sizeof(QPoint));//拷贝数据到array
        m_PcliSocket->write(array,HEDERLEN+MAXDATASEND*sizeof(QPoint)+1);
        bool abcd = m_PcliSocket->waitForBytesWritten(30000);//等待发送缓冲区为空
        qDebug() << "return is " << abcd << endl;
      //RecvThread::SLEEP(200);
       int cao = m_PcliSocket->bytesToWrite();
       qDebug() << "cao is " << cao << endl;
    }
   unsigned int last  = 0;
    if(i>0)
       last = sendNUmber%MAXDATASEND;
    else
        last = sendNUmber - (i)*MAXDATASEND;
    if(last > 0 || i==0)//最后剩下不足1200字节的最后发送一次
    {
        char array[1265] = {0};
        m_strMsgType.len = last;
        memcpy(array,&m_strMsgType,HEDERLEN);
        memcpy(array+HEDERLEN,&m_pSendDatabuf[sendNUmber-last],last*sizeof(QPoint));//每次数据1265个字节,其中1200个是数据

        m_PcliSocket->write(array,HEDERLEN+last*sizeof(QPoint)+1);
    }
    qDebug() << "shiji fasong cishu is " << count << endl;
    m_strMsgType.len = 0;
 }

以下是接收函数


void MySocket::RecvData(msgType& pRecvdata)
{
    memset(&pRecvdata,'0',sizeof(msgType));
    m_PcliSocket->waitForReadyRead(30000);
    QByteArray recvdata=m_PcliSocket->read(1265);//每次只读1265个字节
    {
    char *ch;
    ch = recvdata.data();
    memcpy(&pRecvdata,ch,sizeof(msgType));//收到数据,存入pRecvdat
    if(pRecvdata.type[0] == 'T' && (pRecvdata.type[1] == None) )//即为None
     {
      qDebug() << "kaishi recv len" << pRecvdata.len << endl;
      if(m_pRecvDatabuf == NULL)
      m_pRecvDatabuf = new QPoint[MAXSENDNUMBER+1];//


      memcpy(m_pRecvDatabuf,ch+HEDERLEN,MAXDATASEND*sizeof(QPoint)+1);//收到数据,存入 m_pRecvDatabuf!!!!
     }
    }
}


 现在的情况是:
另一客户端发送数据给服务器,服务器再转发给我的时候,前面收到几个数据后,后面我的数据会丢失,其实也不是丢失,就是会感觉卡了。后面的数据有时候要很久才能到来,甚至会一直不来。单步调试的话,就会全部收到数据。
这问题困扰几天了,求教....



[解决办法]
没仔细看  但你读的地方 应该阻塞的一直read 
直到返回0为止
m_PcliSocket->write(array,HEDERLEN+MAXDATASEND*sizeof(QPoint)+1);
你这个地方write完所有的数据了吗
m_PcliSocket->waitForBytesWritten(30000);//等待发送缓冲区为空
这个操作每次都一直超时等待发送


[解决办法]
bool abcd = m_PcliSocket->waitForBytesWritten(30000);//等待发送缓冲区为空

把 30000 改小,我只用1的。你可以根据情况改小。
需要时判断返回值。
[解决办法]
引用:
引用:
没仔细看  但你读的地方 应该阻塞的一直read 
直到返回0为止
m_PcliSocket->write(array,HEDERLEN+MAXDATASEND*sizeof(QPoint)+1);
你这个地方write完所有的数据了吗
m_PcliSocket->waitForBytesWritten(30000);//等待发送缓冲区为空
这……



while(true)
{
   ssize_t readLen = read(fd,buffer,sizeof(buffer);
   if ( 0 == readLen )
   {
      break;
   }
   else if ( -1 == readLen )
   {
      if ( EINTR == error 
[解决办法]
 EWOULDBLOCK == error )
      {
         continue;
      }
   }
   else
   {
       //handle your buffer here
   }
}

实际上 我不太推荐用QTcpSocket这样的类  混杂了signal和slot 处理反而不如传统的send recv 清楚
你可以参见我上面写的简单流程
[解决办法]
你可以参考一下Qt自带的例子

热点排行