> 自定义了一套协议,本地收到服务器的组包的不一定有序,这时该采取什么方案比较好?
比如当包1来了后,可能下一个是包4,然后包3,包2 这样子的,我要把这些包组合好后写入文件(这些包在远处本身就是一个文件拆开来发的)。请有做个这方面的兄弟给点意见!小弟谢了先。
比如当包1来了后,可能下一个是包4,然后包3,包2 这样子的,我要把这些包组合好后写入文件(这些包在远处本身就是一个文件拆开来发的)。请有做个这方面的兄弟给点意见!小弟谢了先。
【注意记录 已经填充好的包,完成后 检查记录,判断文件是否接收完毕】
这样就不怕包乱序了,也不怕丢包,能检查是否成功..
你将私有协议封装在一个结构体内部,在结构体中另定义seq(序列号),head(头标识),tail(尾标识)。
你对收到的包根据seq来排序,然后根据head和tail来还原被分割的包
首先定义一个数组指针a,数组大小为一共的可能收到多少包,并初始化为全0。
当收到包2时,先包2存在内存中,用一个指针指向他,将数组a[2-1]=包2指针,当收到包4时,将数组a[4-1]=包4指针,以此类推。
在收包的同时,创建一个计数器,收一个包,递加依次,一共记录收到了多少个包。
当计数器达到应该收的包个数时,说明数据包全部收完,根据数组指针的内容依次写入文件。OK!
收到包后,seek文件的位置,然后写入size大小的数据。
另外GPRS怎么了啊, 又不是每个包都收多次, 占什么GPRS啊。接受的数据量是一定的。
建议如下:
(1)每个包里面都要有(包序号, 包的总数)
(2)接受到每个包都先放到一个LIST里面(只放指针), 如果接受到的包的数量=包总数,就开始排序(仅仅是包序号的排列)。
当然你也可以每次放到LIST里面时,做排序插入。那么最后就是逐个取出就可以了。
另外GPRS怎么了啊, 又不是每个包都收多次, 占什么GPRS啊。接受的数据量是一定的。
建议如下:
(1)每个包里面都要有(包序号, 包的总数)
(2)接受到每个包都先放到一个LIST里面(只放指针), 如果接受到的包的数量=包总数,就开始排序(仅仅是包序号的排列)。
当然你也可以每次放到LIST里面时,做排序插入。那么最后就是逐个取出就可以了。
===============================================================================================
1 排序又不是对300K的每个字节排序。 没错,排序不对300K字节,但是得根据相应的排序结果移动这300K字节啊。
要不然排序有什么意义呢? 光排序包序号有什么用?
2 你仔细看看4楼哥们的回复,他的意思是在发送的没个包里面,加上head(头标识),tail这些字段,这是没必要的,在走GPRS传输的时候,包里面的每一个字节都得仔细考虑,因为要考虑到一个流量问题,尽可能的节省流量,再加上GPRS本身的传输速率相对而言比较慢,不同与普通的网络传输.
3 每个包里面都要有(包序号, 包的总数) ,包数据大小。 嗯,这个没错,我们的协议就是这样设计的。