• 6415阅读
  • 7回复

QT中TCP传输问题 [复制链接]

上一主题 下一主题
离线huangweibuct
 

只看楼主 倒序阅读 楼主  发表于: 2010-04-22
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
TCP协议一般单个包最大为1460,我想问下用QT进行TCP发送数据时不用考虑手动将数据分成包一个一个发送?QT能够将读入的数据自动分包?

我看到一个发送图片的例子,服务端:
  1. QBuffer buffer;
  2.   QImageWriter writer(&buffer, "JPG");
  3.   writer.write( randomImage() );
  4.   
  5.   QByteArray data;
  6.   QDataStream stream( &data, QIODevice::WriteOnly );
  7.   stream.setVersion( QDataStream::Qt_4_0 );
  8.   stream << (quint32)buffer.data().size();
  9.   data.append( buffer.data() );
  10.   
  11.   socket.write( data );

客户端:
  1. QByteArray array = socket.read( dataSize );
  2.   QBuffer buffer(&array);
  3.   buffer.open( QIODevice::ReadOnly );
  4.   
  5.   QImageReader reader(&buffer, "JPG");
  6.   QImage image = reader.read();
  7.   QImageWriter writer("1.jpg","JPG");
  8.   writer.write(image);


并没有人工分包读取后发送,而是将整张图片读到缓存后,写到socket上。
我想问问QT这种机制是什么。我没有啥材料,就是硬生生的看例子和C++GUI那本书,随意不太理解QT的一些机制。
谢谢.
离线iiiyyyhhhsss

只看该作者 1楼 发表于: 2010-04-22
你只要执行了tcpSocket->write(byteArray)函数,
tcpsocket就会自动在后台,按照tcp协议的内容,帮你把数据准确无误地发到对方...

你所说的分包自然是在后台进行的。。
离线huangweibuct

只看该作者 2楼 发表于: 2010-04-22
谢谢。我还想问下。readyRead()这个信号是当有新数据来的时候所触发。也就是说TCP的每一包到达后都会出发一次此信号。
但是实际上程序当中此信号出发后就将所有数据受到,而不是TCP的一包数据。我想问问是为什么?
离线huangweibuct

只看该作者 3楼 发表于: 2010-04-22
客户端那段代码是在信号触发后执行的。按理来说应该过来一个包执行一次。但是实际上就直接将整个图片数据全部写入文件
离线iiiyyyhhhsss

只看该作者 4楼 发表于: 2010-04-22
我们知道,数据包被接收后,都是先被存储在缓存里的。

readyRead()不是你想象的那样,每一个包达到,就触发一次的。。。

而是,当存储接收数据包的数据缓存到达一定量的时候,又或者所有接收完所有数据包后,才会被触发的。。
离线huangweibuct

只看该作者 5楼 发表于: 2010-04-22
那这个一定量是多少?如果我发送的数据大于这个一定量,该怎么判断。
还有我想问下,QT自带的帮助里讲的readyRead()没有那么详细,看什么资料能详细了解到这些函数的原理和作用。谢谢
离线thinkbad

只看该作者 6楼 发表于: 2010-04-23
恩Re:QT中TCP传输问题
引用第4楼iiiyyyhhhsss于2010-04-22 18:32发表的  :
我们知道,数据包被接收后,都是先被存储在缓存里的。
readyRead()不是你想象的那样,每一个包达到,就触发一次的。。。
而是,当存储接收数据包的数据缓存到达一定量的时候,又或者所有接收完所有数据包后,才会被触发的。。


通问 这个一定量 是如何定的? 当然我们按照官方实例写程序时并没有在意这个,我们的程序也会运行得很正常
离线yj_yulin

只看该作者 7楼 发表于: 2010-04-24
TCP/IP大全之类的书可以先搞来看个大概,对流,缓冲,窗口控制有些了解就基本能明白的
快速回复
限100 字节
 
上一个 下一个