再谈消息包和几张图

来源:互联网 发布:sql去重 编辑:程序博客网 时间:2024/06/05 09:20

1048576 内部server之间 send recvbuffer大小

32767  gateserver对AS客户端之间 send recvbuffer大小

要发消息,触发发送事件,那么把现在sendlist的消息发送完,如果长度大于sendbuffer长度,那么就发送最大的sendbuffer

问:一个消息不是断了吗?

答:记录位置,记录消息体写到哪了 下次发送的时候继续从记录位置往后的写入


读的时候取出来的数据可能 小于头 4个字节,可能大于4 ,每次receive从内核取出来放到应用层不一定就是一个完整的4+xxx的包,可能只取了一部分,如果这次一开始小于4,那么不解析,第二次调receive,得到50字节,因为上次比如只取了1字节,这次就先取三个字节,然后解析这四字节,比如100,0 就说明上面图里面的a是100,然后解析后面的,但是这次后面的只剩下50-3=47字节,那么读完47 。第二次receive到的字节,比如是200,那么就取前面的53字节,这53字节是作为上次剩下的,读完53,然后剩下的 再从头4字节解析

里面的消息体124+xx也是一样,每次读到的未必读完,比如得到消息体长度50,那么后面读,但是要判断后面你能不能读50字节,有可能再一个大包里面,有可能不在,如果根据大包的包头算出来本大包后面只有40字节,那么后面剩下的10字节肯定是在下一个大包了,得先解析下一个大包的头4个字节,然后后面的10个字节才是上一个消息的,  否则直接度50个作为消息,后面就乱了


 要判断各种情况,一个消息体(比如sm_move)接没接收完,读到哪了,以及一个大包有没有接受完,接到哪了, 
 要注意这两个关键数字