- 论坛徽章:
- 0
|
本帖最后由 fdl19881 于 2012-06-19 14:29 编辑
如果在运输层会超过一个包的最大长度65535的话, 那还是用tcp吧。
使用udp的情况下,会出现丢失,还得自己写确认的代码,且还得自己把包分成多个,然边手动组装。
用tcp的情况 , 接收端没关系, 本来就是字节流。
这种情况的数据格式如下:(参考下)
起始位1B + 数据长度4B(指后面数据部分长度) + 数据部分 [+ 结束码1B(可要可不要)]
发的时候:1.先按照这个格式把包组装好。
2. 自己将包拆成每1460字节(以下)全部按顺序使用send发出。
3. OK.
收的过程:收端得记录收数据的状态: 如:enum {WAITSTART, WAITLEN0 , WAITDATA1 , WAITDATA2, WAITDATA3 , WAITDATA } stat;
表示当stat == WAITSTART :指等待一个起始数据(你的一个新的结构体)
stat == WAITLEN##i : 当上一个状态,收到的一个字节与起始位相同时,就转到这个状态。 依次等待4个字节的长度。假设四个字节的长度为n
stat == WAITDATA: 当上一个状态,收完4个字节的长度信息n时,转到此状态. 继续等待实际的数据部分。 若收完n个字节后,表示收到一个完整的数据,,此时这个结构体就可以拿来使用了。stat接着转入WAITSTART状态。
上面所以说的说到1个字节 ,再一个字节 ,并不是要你使用recv或者read一次只读一个字节,注意这是面向流的。 而是说一次读MAX个字节后,一个个处理.
具我所知的tcp发送时一般可以使用这种方法发送。 至于说万一中间出现一次混乱,那怎么办。我只能说你得好好控制自己的程序,一般只要send或者write是严格按照上面的格式发送。那么tcp又是可靠的情况下,一般是不会出现混乱的。。。 还有一点既然数据部分是结构体,你就检查下这个结构体的信息是否正确。不正确的话,就丢弃吧。准备接下一个
或者为了可靠性,你就在后面再跟上几个字节的检验码吧。(如果真有这个必要) |
|