关于Qt中Udp通信过程中的接收数据部分注意
2012-11-21 22:00
525 查看
Communication::Communication(Global *a) { varcom=a; msg=new QMessageBox(); udpclient=new QUdpSocket(this); // QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); udpclient->bind(1111,QUdpSocket::ShareAddress); connect(udpclient,SIGNAL(readyRead()),this,SLOT(recv()));//---------------------------------------1 errorarray.resize(20); } void Communication::recv() { for(int i=0;i<errorarray.count();i++) { errorarray[i]=0x00; } while(udpclient->hasPendingDatagrams()) { QByteArray data; data.resize(udpclient->pendingDatagramSize()); for(int i=0;i<data.count();i++) { data[i]=0x00; } udpclient->readDatagram(data.data(),data.size()); getarray.resize(data.count()); for(int i=0;i<getarray.count();i++) { getarray[i]=data[i]; qDebug("recive recv[%d]=%x",i,(byte)getarray[i]); } emit hadrecvedplus(getarray);//----------------------------------------------------------------2 byte operatetype=(byte)data[0]; byte operateobj=(byte)data[1]; switch(operatetype) { //…… } } emit hadrecved(errorarray); // emit hadrecvedplus(getarray);//----------------------------------------------------------------3 }
注意前面的 1、2、3 三个地方
当从端口收到数据时在1处会通过信号与槽机制调用recv()函数;
在通信过程中有可能出现收到两大组数据,其中某一组包含完整的三小组数据,而另外一组包含一组数据(这只是举例,但实际却这样发生了)这样的情况。这样就会只调用两次recv()函数,这样如果你想通过信号将收到的数据包发射出去进行处理,那么你的信号函数hadrecvedplay(getarray)应该在 2 处发射而不是 3 处,在2处会发射完整的4次,若在3 处发射的话只会发射2次,因为recv()函数只调用了两次,这样外界处理时就会丢掉两次处理机会,造成数据丢失或错误
相关文章推荐
- 26 API-网络编程(网络概述,Socket通信机制,UDP协议发送和接收数据,TCP协议发送和接收数据)
- 网络通信 TCP UDP 接收数据
- 关于mysql存储过程,返回多个表数据的接收问题。
- 【菜鸟学Qt—5】Qt中 udp的初始化及数据接收
- Contiki通信之数据接收过程
- TCP UDP多机通信无法接收到数据的问题
- UDP和TCP通信机制(实现简单的数据发送与接收)
- UDP协议发送数据:UDP协议接收数据:UDP协议收发数据注意事项
- 关于Qt移植后环境变量的设置 qt移植到arm中文显示问题解决 实现pc与tiny210 arm开发板 udp通信(续上)
- NB-IOT之一个完整的BC95 UDP从开机到数据发送接收过程
- 关于linux下的udp/tcp通信设置发送sendto/接收recvfrom信息超时的参数。解决通道堵塞问题。
- QT5 串口(com)通信_16进制数发送与接收以及接收数据提取
- QT学习过程及简单串口和UDP通信demo开发过程及代码分享
- 关于TCP/UDP数据传输过程
- 关于通信中数据接收的处理方法讨论
- QT中TCP/UDP通信数据的组织
- 关于Socket通信中多个线程同时向一个服务端口发送数据时的注意点
- 某个数据通信系统采用CRC校验方式,并且生成多项式的二进制比特序列为11001,目的结点接收到的二进制比特序列为 110111001(含CRC校验码)。请判断传输过程中是否出现了差错?为什么?
- 关于Qt移植后环境变量的设置 qt移植到arm中文显示问题解决 实现pc与tiny210 arm开发板 udp通信
- 关于UDP向本机端口发送数据报但是接收不到数据的问题