Qt套接字缓冲区数据如何清空?

时间:2021-02-23 11:07:46
Qt中有什么东西可以让套接字缓冲区的数据清空吗?
   我从服务端接收了一个文件后;接收第二个文件,读取服务端发过来的文件数据大小时候,读取文件数据大小读出来的全是乱码;也就是说,我之前第一个文件的数据还在呢;
  不知道有没有什么方法可以让缓冲区清空啊;;; Qt套接字缓冲区数据如何清空?
  各路神仙救命啊~!

22 个解决方案

#1


Qt套接字缓冲区数据如何清空?
娘的,更新模块把文件接过来,大小虽然都一样,但是大多数绝对多数文件里面有很多不应该有的数据,说白了;黏包了;;我读的那块没什么问题,就搞不懂问题在哪里了;~!

#2


笨方法:readAll
服务端设计有问题

#3


引用 2 楼 zmlovelx 的回复:
笨方法:readAll
服务端设计有问题


Qt套接字缓冲区数据如何清空?
 我以为大神们会用什么高级方法,原来和我一样;;
   我想请问下大神:  一个 文件,我通过 QFile  _file.size();测出大小;
   这个文件中在末尾有一个结束符,我们测出来的大小包含了这个结束符吗?结束符是否算在大小之内的?
  是不是每一个文件都会有一个结束符? Qt套接字缓冲区数据如何清空?

#4


引用 2 楼 zmlovelx 的回复:
笨方法:readAll
服务端设计有问题


  大神:你好;
  还有几个问题  
  客户端 
connect(*m_socket,SIGNAL(readyread()),this,SLOT(readMsg()));

如这段代码,这段代码的意思是:每当 套接字缓冲区有新的信息到来,就执行 readMsg();函数,如果  来了一个数据,好开始执行,但是当我们正在执行到这个函数的某个阶段还没有结束的时候,又收到了新的信息;这个时候这个 槽函做出的反应是如何的?等正在执行的函数执行完毕,再次执行吗?


以及 readALL();函数,读取套接字缓冲区内的 数据,帮助文档对该函数解释如下:读取缓冲区全部可用数据;这里得可用数据是多少?全部吗?读到 m_socket ==0 的数据大小码?

#5


   ╮(╯▽╰)╭,,为了加加人气:跑到人家帖子开了传送门,这样不是不厚道;
     希望各位大神们,理解下;;
    恩,等级低,只能给100分;
    事后,在C++中开启更多散分贴,给各路神仙们 散分;
  当然,这分算不了什么;也不是说这分多值钱;只是各路神仙在CSDN助人为乐的见证罢了;
  技术么,得共享才有意思么~~! Qt套接字缓冲区数据如何清空?Qt套接字缓冲区数据如何清空?

#6


 C/S ,首先你要确定,有效数据(有效包体)。 每个包的长度,C/S双方都应该知道。
      格式: 包长+协议号+版本号+ 数据  (版本和协议号自己决择..)

#7


你确定你的数据包的协议设计得正确?
你的数据包,携带了多大的数据等等,对两端来说都应该是透明的。

网络数据发送,都需要序列化(流的概念)。流化过程中,需要把数据包携带的数据类型,数据长度等都到写入,以便对端解析。

socket本身不分是QT的还是Windows的。在传输上没有什么区别。

#8


1. 不需要什么结束符,你用十六进制编辑器看吧
2.  取决与connect 
When a signal is emitted, the slots connected to it are usually executed immediately, just like a normal function call. When this happens, the signals and slots mechanism is totally independent of any GUI event loop. Execution of the code following the emit statement will occur once all slots have returned. The situation is slightly different when using queued connections; in such a case, the code following the emit keyword will continue immediately, and the slots will be executed later.
如果是上面所说的第一种情况,多个signal出现,则会出现slot被多次调用,也就是一般所说的同时运行,第二种情况按队列顺序执行  (当然结论只是猜测)
 3. 全部读  当然不包括将来发来的包

#9


引用 6 楼 lile1234_show 的回复:
 C/S ,首先你要确定,有效数据(有效包体)。 每个包的长度,C/S双方都应该知道。
      格式: 包长+协议号+版本号+ 数据  (版本和协议号自己决择..)


可以看下 3 . 4 .5L的问题吗?麻烦帮我解答下吧? 可以吗? Qt套接字缓冲区数据如何清空?

#10


建议下载研究eMule源代码。

#11


Qt套接字缓冲区数据如何清空?

如图,这里我是一个 switch();循环,全面几个 case是 接收数据头大小;包长,版本号,数据,等等;
    执行到这个部分呢,套接字缓冲区是没有数据了的,只会等待服务端发送 文件数据过来;
  m_fileSize //这是文件的大小;
  但是当我读完了 m_fileSize;大小的数据后,发现 套接字缓冲区竟然还有 512Byte数据;
 我就搞不懂 怎么出现的512Byte数据了/  所以用 m_tcpClient->read( m_tcpClient.size());清空缓冲区了;;;;;所以 我把512Byte数据联想到了 是不是文件末尾的结束符占用了 这 512Byte;~!

#12


引用 6 楼 lile1234_show 的回复:
 C/S ,首先你要确定,有效数据(有效包体)。 每个包的长度,C/S双方都应该知道。
      格式: 包长+协议号+版本号+ 数据  (版本和协议号自己决择..)


11L,麻烦解释下吧~!

#13


引用 10 楼 zhao4zhong1 的回复:
建议下载研究eMule源代码。





引用 7 楼 CKnightx 的回复:
你确定你的数据包的协议设计得正确?
你的数据包,携带了多大的数据等等,对两端来说都应该是透明的。

网络数据发送,都需要序列化(流的概念)。流化过程中,需要把数据包携带的数据类型,数据长度等都到写入,以便对端解析。

socket本身不分是QT的还是Windows的。在传输上没有什么区别。


引用 8 楼 zmlovelx 的回复:
1. 不需要什么结束符,你用十六进制编辑器看吧
2.  取决与connect 
When a signal is emitted, the slots connected to it are usually executed immediately, just like a normal function call. When this happens, the signals and slots mechanism is totally independent of any GUI event loop. Execution of the code following the emit statement will occur once all slots have returned. The situation is slightly different when using queued connections; in such a case, the code following the emit keyword will continue immediately, and the slots will be executed later.
如果是上面所说的第一种情况,多个signal出现,则会出现slot被多次调用,也就是一般所说的同时运行,第二种情况按队列顺序执行  (当然结论只是猜测)
 3. 全部读  当然不包括将来发来的包



烦请各位看下 11L 的问题;; Qt套接字缓冲区数据如何清空?

#14


case是 接收数据头大小;包长,版本号,数据,等等

case 这么多?

这代码。。。

发送的时候,是读文件的二进制内容吧?
读文件的二进制内容,就没有什么结束符的说法。

你发送文件的时候,告诉接收端文件的大小了吗。

我不熟悉QT,但是我感觉这跟socket缓冲区没有关系

#15


引用 14 楼 CKnightx 的回复:
case是 接收数据头大小;包长,版本号,数据,等等

case 这么多?

这代码。。。

发送的时候,是读文件的二进制内容吧?
读文件的二进制内容,就没有什么结束符的说法。

你发送文件的时候,告诉接收端文件的大小了吗。

我不熟悉QT,但是我感觉这跟socket缓冲区没有关系


恩,好的;谢谢;  文件大小肯定告诉了;;;文件头准备得很足,文件名,文件大小;都一起扔过去了;;;╮(╯▽╰)╭..
   虽然完成了,但是好奇的是 那 512Byte数据到底是什么来的..
     我敢保证的是,那 512Byte数据一定是 服务端发送更新文件时一起发的;;;但是我接收文件后,与服务端文件对比,文件的大小,数据内容,数据位置,等等;都是一模一样的,没有差别;;  200MB文件都是如此;;;
  现在好奇的是 那 512Byte数据怎么来的;

#16


Qt套接字缓冲区数据如何清空?Qt套接字缓冲区数据如何清空?Qt套接字缓冲区数据如何清空?
你们去哪里了?~!

#17


提醒:文件大小可能大于4GB。
问题不在于缓冲区清空,而在于接收方每收到比如4096字节给发送方一个确认信息,发送方收到此确认信息后再发送后续数据。和两人对话一样,这边说几句后,要等到那边说比如“哦”、“您继续说”、“我在听”后再接着往下说。你能想象这边说了比如一个小时,那边一声不吭的情况吗?谁知道那边人还在不在!?
Qt套接字缓冲区数据如何清空?

#18


引用 17 楼 zhao4zhong1 的回复:
提醒:文件大小可能大于4GB。
问题不在于缓冲区清空,而在于接收方每收到比如4096字节给发送方一个确认信息,发送方收到此确认信息后再发送后续数据。和两人对话一样,这边说几句后,要等到那边说比如“哦”、“您继续说”、“我在听”后再接着往下说。你能想象这边说了比如一个小时,那边一声不吭的情况吗?谁知道那边人还在不在!?
Qt套接字缓冲区数据如何清空?


Qt套接字缓冲区数据如何清空?
这样没必要吧?  服务端发数据  封装数据包 采用 resize(512);  客户端一次读 512;保证读空;
   文件大小大于4GB?
  我去?  一个文件大于4GB?
  什么概念? 我估计这辈子都碰不上,你想得多,想得宽... 大到4GB了? 哈哈,我用64bit系统工作~! Qt套接字缓冲区数据如何清空?



感觉你这多此一举~! 4096字节就这样,无异于浪费时间; 

#19


引用 17 楼 zhao4zhong1 的回复:
提醒:文件大小可能大于4GB。
问题不在于缓冲区清空,而在于接收方每收到比如4096字节给发送方一个确认信息,发送方收到此确认信息后再发送后续数据。和两人对话一样,这边说几句后,要等到那边说比如“哦”、“您继续说”、“我在听”后再接着往下说。你能想象这边说了比如一个小时,那边一声不吭的情况吗?谁知道那边人还在不在!?
Qt套接字缓冲区数据如何清空?



赵老师,你这方法看似靠谱;
 但是我觉得,,没必要;;;;人家肯定在的,不在 TCP发布出去啊;;我进度条肯定会记录的,发出去了的才算在进度条里面呢;

#20


我也是遇到这个问题 你后来怎么解决的

#21


对啊,我现在在用qt基于udp做一个图片传输的软件,可是一直丢包。楼主最后怎么解决的呢?

#22


已经解决
我的是因为缓冲区不够,可以用这一句申请内存。
 receiver->setSocketOption(
                QAbstractSocket::ReceiveBufferSizeSocketOption,
                1024*1024*100);//给套接字申请一个100M的内存空间,receiver是QUdpSocket 类型

#1


Qt套接字缓冲区数据如何清空?
娘的,更新模块把文件接过来,大小虽然都一样,但是大多数绝对多数文件里面有很多不应该有的数据,说白了;黏包了;;我读的那块没什么问题,就搞不懂问题在哪里了;~!

#2


笨方法:readAll
服务端设计有问题

#3


引用 2 楼 zmlovelx 的回复:
笨方法:readAll
服务端设计有问题


Qt套接字缓冲区数据如何清空?
 我以为大神们会用什么高级方法,原来和我一样;;
   我想请问下大神:  一个 文件,我通过 QFile  _file.size();测出大小;
   这个文件中在末尾有一个结束符,我们测出来的大小包含了这个结束符吗?结束符是否算在大小之内的?
  是不是每一个文件都会有一个结束符? Qt套接字缓冲区数据如何清空?

#4


引用 2 楼 zmlovelx 的回复:
笨方法:readAll
服务端设计有问题


  大神:你好;
  还有几个问题  
  客户端 
connect(*m_socket,SIGNAL(readyread()),this,SLOT(readMsg()));

如这段代码,这段代码的意思是:每当 套接字缓冲区有新的信息到来,就执行 readMsg();函数,如果  来了一个数据,好开始执行,但是当我们正在执行到这个函数的某个阶段还没有结束的时候,又收到了新的信息;这个时候这个 槽函做出的反应是如何的?等正在执行的函数执行完毕,再次执行吗?


以及 readALL();函数,读取套接字缓冲区内的 数据,帮助文档对该函数解释如下:读取缓冲区全部可用数据;这里得可用数据是多少?全部吗?读到 m_socket ==0 的数据大小码?

#5


   ╮(╯▽╰)╭,,为了加加人气:跑到人家帖子开了传送门,这样不是不厚道;
     希望各位大神们,理解下;;
    恩,等级低,只能给100分;
    事后,在C++中开启更多散分贴,给各路神仙们 散分;
  当然,这分算不了什么;也不是说这分多值钱;只是各路神仙在CSDN助人为乐的见证罢了;
  技术么,得共享才有意思么~~! Qt套接字缓冲区数据如何清空?Qt套接字缓冲区数据如何清空?

#6


 C/S ,首先你要确定,有效数据(有效包体)。 每个包的长度,C/S双方都应该知道。
      格式: 包长+协议号+版本号+ 数据  (版本和协议号自己决择..)

#7


你确定你的数据包的协议设计得正确?
你的数据包,携带了多大的数据等等,对两端来说都应该是透明的。

网络数据发送,都需要序列化(流的概念)。流化过程中,需要把数据包携带的数据类型,数据长度等都到写入,以便对端解析。

socket本身不分是QT的还是Windows的。在传输上没有什么区别。

#8


1. 不需要什么结束符,你用十六进制编辑器看吧
2.  取决与connect 
When a signal is emitted, the slots connected to it are usually executed immediately, just like a normal function call. When this happens, the signals and slots mechanism is totally independent of any GUI event loop. Execution of the code following the emit statement will occur once all slots have returned. The situation is slightly different when using queued connections; in such a case, the code following the emit keyword will continue immediately, and the slots will be executed later.
如果是上面所说的第一种情况,多个signal出现,则会出现slot被多次调用,也就是一般所说的同时运行,第二种情况按队列顺序执行  (当然结论只是猜测)
 3. 全部读  当然不包括将来发来的包

#9


引用 6 楼 lile1234_show 的回复:
 C/S ,首先你要确定,有效数据(有效包体)。 每个包的长度,C/S双方都应该知道。
      格式: 包长+协议号+版本号+ 数据  (版本和协议号自己决择..)


可以看下 3 . 4 .5L的问题吗?麻烦帮我解答下吧? 可以吗? Qt套接字缓冲区数据如何清空?

#10


建议下载研究eMule源代码。

#11


Qt套接字缓冲区数据如何清空?

如图,这里我是一个 switch();循环,全面几个 case是 接收数据头大小;包长,版本号,数据,等等;
    执行到这个部分呢,套接字缓冲区是没有数据了的,只会等待服务端发送 文件数据过来;
  m_fileSize //这是文件的大小;
  但是当我读完了 m_fileSize;大小的数据后,发现 套接字缓冲区竟然还有 512Byte数据;
 我就搞不懂 怎么出现的512Byte数据了/  所以用 m_tcpClient->read( m_tcpClient.size());清空缓冲区了;;;;;所以 我把512Byte数据联想到了 是不是文件末尾的结束符占用了 这 512Byte;~!

#12


引用 6 楼 lile1234_show 的回复:
 C/S ,首先你要确定,有效数据(有效包体)。 每个包的长度,C/S双方都应该知道。
      格式: 包长+协议号+版本号+ 数据  (版本和协议号自己决择..)


11L,麻烦解释下吧~!

#13


引用 10 楼 zhao4zhong1 的回复:
建议下载研究eMule源代码。





引用 7 楼 CKnightx 的回复:
你确定你的数据包的协议设计得正确?
你的数据包,携带了多大的数据等等,对两端来说都应该是透明的。

网络数据发送,都需要序列化(流的概念)。流化过程中,需要把数据包携带的数据类型,数据长度等都到写入,以便对端解析。

socket本身不分是QT的还是Windows的。在传输上没有什么区别。


引用 8 楼 zmlovelx 的回复:
1. 不需要什么结束符,你用十六进制编辑器看吧
2.  取决与connect 
When a signal is emitted, the slots connected to it are usually executed immediately, just like a normal function call. When this happens, the signals and slots mechanism is totally independent of any GUI event loop. Execution of the code following the emit statement will occur once all slots have returned. The situation is slightly different when using queued connections; in such a case, the code following the emit keyword will continue immediately, and the slots will be executed later.
如果是上面所说的第一种情况,多个signal出现,则会出现slot被多次调用,也就是一般所说的同时运行,第二种情况按队列顺序执行  (当然结论只是猜测)
 3. 全部读  当然不包括将来发来的包



烦请各位看下 11L 的问题;; Qt套接字缓冲区数据如何清空?

#14


case是 接收数据头大小;包长,版本号,数据,等等

case 这么多?

这代码。。。

发送的时候,是读文件的二进制内容吧?
读文件的二进制内容,就没有什么结束符的说法。

你发送文件的时候,告诉接收端文件的大小了吗。

我不熟悉QT,但是我感觉这跟socket缓冲区没有关系

#15


引用 14 楼 CKnightx 的回复:
case是 接收数据头大小;包长,版本号,数据,等等

case 这么多?

这代码。。。

发送的时候,是读文件的二进制内容吧?
读文件的二进制内容,就没有什么结束符的说法。

你发送文件的时候,告诉接收端文件的大小了吗。

我不熟悉QT,但是我感觉这跟socket缓冲区没有关系


恩,好的;谢谢;  文件大小肯定告诉了;;;文件头准备得很足,文件名,文件大小;都一起扔过去了;;;╮(╯▽╰)╭..
   虽然完成了,但是好奇的是 那 512Byte数据到底是什么来的..
     我敢保证的是,那 512Byte数据一定是 服务端发送更新文件时一起发的;;;但是我接收文件后,与服务端文件对比,文件的大小,数据内容,数据位置,等等;都是一模一样的,没有差别;;  200MB文件都是如此;;;
  现在好奇的是 那 512Byte数据怎么来的;

#16


Qt套接字缓冲区数据如何清空?Qt套接字缓冲区数据如何清空?Qt套接字缓冲区数据如何清空?
你们去哪里了?~!

#17


提醒:文件大小可能大于4GB。
问题不在于缓冲区清空,而在于接收方每收到比如4096字节给发送方一个确认信息,发送方收到此确认信息后再发送后续数据。和两人对话一样,这边说几句后,要等到那边说比如“哦”、“您继续说”、“我在听”后再接着往下说。你能想象这边说了比如一个小时,那边一声不吭的情况吗?谁知道那边人还在不在!?
Qt套接字缓冲区数据如何清空?

#18


引用 17 楼 zhao4zhong1 的回复:
提醒:文件大小可能大于4GB。
问题不在于缓冲区清空,而在于接收方每收到比如4096字节给发送方一个确认信息,发送方收到此确认信息后再发送后续数据。和两人对话一样,这边说几句后,要等到那边说比如“哦”、“您继续说”、“我在听”后再接着往下说。你能想象这边说了比如一个小时,那边一声不吭的情况吗?谁知道那边人还在不在!?
Qt套接字缓冲区数据如何清空?


Qt套接字缓冲区数据如何清空?
这样没必要吧?  服务端发数据  封装数据包 采用 resize(512);  客户端一次读 512;保证读空;
   文件大小大于4GB?
  我去?  一个文件大于4GB?
  什么概念? 我估计这辈子都碰不上,你想得多,想得宽... 大到4GB了? 哈哈,我用64bit系统工作~! Qt套接字缓冲区数据如何清空?



感觉你这多此一举~! 4096字节就这样,无异于浪费时间; 

#19


引用 17 楼 zhao4zhong1 的回复:
提醒:文件大小可能大于4GB。
问题不在于缓冲区清空,而在于接收方每收到比如4096字节给发送方一个确认信息,发送方收到此确认信息后再发送后续数据。和两人对话一样,这边说几句后,要等到那边说比如“哦”、“您继续说”、“我在听”后再接着往下说。你能想象这边说了比如一个小时,那边一声不吭的情况吗?谁知道那边人还在不在!?
Qt套接字缓冲区数据如何清空?



赵老师,你这方法看似靠谱;
 但是我觉得,,没必要;;;;人家肯定在的,不在 TCP发布出去啊;;我进度条肯定会记录的,发出去了的才算在进度条里面呢;

#20


我也是遇到这个问题 你后来怎么解决的

#21


对啊,我现在在用qt基于udp做一个图片传输的软件,可是一直丢包。楼主最后怎么解决的呢?

#22


已经解决
我的是因为缓冲区不够,可以用这一句申请内存。
 receiver->setSocketOption(
                QAbstractSocket::ReceiveBufferSizeSocketOption,
                1024*1024*100);//给套接字申请一个100M的内存空间,receiver是QUdpSocket 类型