首页| 论坛| 消息

标题:请教关于QSocket的问题
作者:alex_zhf
日期:2008-10-31 16:11
内容:

我用QSocket以数据流的形式发送数据,发现服务器端接收的时候会出现接收了几次就丢包的现象,传输的数据大概3K,跟踪后发现QSocket发送时是分了两次发送的,而在服务器端可能因为两次发送时间过密造成接收不过来,有没有什么好办法控制客户端的分包发送呢,比如,发完一次,休息一段时间?


#1 [alex_zhf 10-31 21:17]
怎么没有人顶阿,自己顶,高手指点一下吧,为这个问题困扰了很久了!
#2 [XChinux 11-01 08:26]
因为数据发送时如果某次的数据没有达到缓冲区大小,则会缓存住待缓冲区满后一起发,所以另一端会出现一次接收不完全。
可以自己定义每个数据包长度(在数据开头处定义),双方接收时开头的按照数据包定义的长度来接收数据。或者每次发送的数据都固定大小,另一端接收时也按固定大小接收。还可以在每段数据发送完后再加发一个'\0',以让数据发送出去,另一端收数据时直到接收到'\0'才开始处理数据。
#3 [alex_zhf 11-01 10:49]
引用第2楼XChinux于2008-11-01 08:26发表的 :
因为数据发送时如果某次的数据没有达到缓冲区大小,则会缓存住待缓冲区满后一起发,所以另一端会出现一次接收不完全。
可以自己定义每个数据包长度(在数据开头处定义),双方接收时开头的按照数据包定义的长度来接收数据。或者每次发送的数据都固定大小,另一端接收时也按固定大小接收。还可以在每段数据发送完后再加发一个'
#4 [alex_zhf 11-01 10:56]
引用第2楼XChinux于2008-11-01 08:26发表的 :
因为数据发送时如果某次的数据没有达到缓冲区大小,则会缓存住待缓冲区满后一起发,所以另一端会出现一次接收不完全。
可以自己定义每个数据包长度(在数据开头处定义),双方接收时开头的按照数据包定义的长度来接收数据。或者每次发送的数据都固定大小,另一端接收时也按固定大小接收。还可以在每段数据发送完后再加发一个'\0',以让数据发送出去,另一端收数据时直到接收到'\0'才开始处理数据。
不好意思,上面的回复中由于乱码出错了,再写一遍。
感谢斑竹的回复,不过还有有一些不明白:
第一、您说数据要等到缓冲区满后一起发送。但是根据我的观察好像不是这样。因为我发送小文件的时候都可以每次正常按时收到数据。而发送大量数据时候并不是太少而是太多,所以每次发送都会被自动分成了几次发送。
第二、斑竹说可以在数据头加上发送数据的大小,或者在尾巴加上‘\0’,能否说得具体点?一来我要发送的是XML格式组织的文档,不好人为拆分它的结构,二来QSocket的发送机制应该是自动的吧,我怎么限定它每次发多少?
第三、有没有人知道QSocket每次能发多少数据量?
再次感谢斑竹,非常棒的论坛!
#5 [vrcats 11-04 20:38]
QSocket有一个bug,就是发送4G以上块的时候会溢出。

<< 1 2 >> (1/2)

回复 发表
主题 版块