读书人

Qt write and read,该如何解决

发布时间: 2013-01-08 14:02:14 作者: rapoo

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自带的例子

读书人网 >QT开发

热点推荐