• 6454阅读
  • 4回复

在TCP编程中的接受数据块判断问题 [复制链接]

上一主题 下一主题
离线suitsun_joe
 
只看楼主 倒序阅读 楼主  发表于: 2011-04-03
这几天用QT写局域网一个客户端,参考一些C++ GUI Qt4中的例子,但是一处看不懂什么意思,望高手指导一下
/****************************************************************************************
voidMainWindow::updataText()  //从服务器接受数据
{
       QDataStream in(tcpSocket);
       in.setVersion(QDataStream::Qt_4_3);
       forever {
          if(nextBlockSize==0)//nextBlockSize是头文件中定义的quint16类型用来存贮数据块大小的    
          {
               if(tcpSocket->bytesAvailable()<sizeof(quint16))break;//这句在这里什么作用?          
               in>>nextBlockSize;  
          }
         if(nextBlockSize==0XFFFF)
         {
              closeConnection();        
              ui->label->setText(tr("Datashasbeenrecievedfinished."));
         }
        if(tcpSocket->bytesAvailable()<nextBlockSize)break;//这句什么作用?
         QStringdata;
         in>>data;
         ui->textEdit->setText(data);
         nextBlockSize=0;
    }
**********************************************************/[/pre]
[ 此帖被suitsun_joe在2011-04-03 15:44重新编辑 ]
离线qianguozheng

只看该作者 1楼 发表于: 2011-04-03
同是新手相互交流啊,我QQ601269358
离线wxj120bw

只看该作者 2楼 发表于: 2011-04-03
引用楼主suitsun_joe于2011-04-03 15:40发表的 在TCP编程中的接受数据块判断问题 :
这几天用QT写局域网一个客户端,参考一些C++ GUI Qt4中的例子,但是一处看不懂什么意思,望高手指导一下
/****************************************************************************************
voidMainWindow::updataText()//从服务器接受数据
{
QDataStream in(tcpSocket);
.......

第一次判断客户端是否收到即将收到数据的大小,第二次判断是否收到第一次第一次制定的数据大小
离线suitsun_joe
只看该作者 3楼 发表于: 2011-04-04
回 2楼(wxj120bw) 的帖子
恩大体意思是这样,昨天我又详细分析了一下,为了让遇到同问题的人深入了解,我吧原因写到这里了,如下:
由于TCP的数据发送或者接收是需要有缓冲区的
因此在接收到开始的数据块大小标志之后并不能立刻直接读取后面的数据(数据长的话更是如此)
因此在读取数据的时候为了保证数据的完整,程序中一般加入if(tcpSocket->bytesAvailable()<nextBlockSize)break;也就是如果缓冲区中可用的数据tcpSocket->bytesAvailable()如果小于原来标记的数据块nextBlockSize大小的时候说明:后面缓冲区的数据还没有完全收到,这时候如果读取必然会出错,因此程序中用return进行等待以便继续检查,其实在一般的情况下如果发送简单的字符什么的不用这个判断也可以,但是这是万无一失的方法,这个例子是《C++ GUI Qt4》中的例子,还是比较专业的。
离线wxj120bw

只看该作者 4楼 发表于: 2011-04-04
Re:回 2楼(wxj120bw) 的帖子
引用第3楼suitsun_joe于2011-04-04 11:20发表的 回 2楼(wxj120bw) 的帖子 :
恩大体意思是这样,昨天我又详细分析了一下,为了让遇到同问题的人深入了解,我吧原因写到这里了,如下:
由于TCP的数据发送或者接收是需要有缓冲区的
因此在接收到开始的数据块大小标志之后并不能立刻直接读取后面的数据(数据长的话更是如此)
因此在读取数据的时候为了保证数据的完整,程序中一般加入if(tcpSocket->bytesAvailable()<nextBlockSize)break;也就是如果缓冲区中可用的数据tcpSocket->bytesAvailable()如果小于原来标记的数据块nextBlockSize大小的时候说明:后面缓冲区的数据还没有完全收到,这时候如果读取必然会出错,因此程序中用return进行等待以便继续检查,其实在一般的情况下如果发送简单的字符什么的不用这个判断也可以,但是这是万无一失的方法,这个例子是《C++ GUI Qt4》中的例子,还是比较专业的。

理解的很对。
快速回复
限100 字节
 
上一个 下一个