UDP包结构
UDP包结构
// 参考: http://www.2cto.com/net/201307/224715.html
UDP数据包由首部和数据组成,每行4个字节(32位),首部固定长度为8个字节(2行)
2、首部
1、 第一行:源端口16位,目的端口16位
表示发送方和接收方的端口号
2、 第二行:UDP包长度16位,UDP校验和16位
UDP包长度:
包括UDP首部在内的以字节为单位的UDP数据报总长度;
校验和:
【待补充算法】
3、数据
IP首部结束之后的部分
编程应用:
//参考: UDP数据包大小和结构 http://blog.csdn.net/nokiaxjw/article/details/8094605
//参考: UDP数据包大小问题 http://blog.csdn.net/buptzwp/article/details/5055487
你用UDP发一包就是一包.要么收到,要么收不到一个完整的包.不能超过路由长度.一个数据包=包头+数据 包头包含了一些基本信息,如包类型是命令还是数据,包总数,当前包编号等等。如果你想知道该读取多少信息,在包头中保存后面数据部分的长度,同时包头写成一个定长结构体,你读取一个包的时候,先把读取定长的包头信息,再根据包头里面的长度len信息来读取len字节的数据,就是后面的数据部分的长度。 如果你包的设计是不定长的,包头应该是一个共用结构体,读取时,分两步, struct Header { char msg_type; //包类型 命令或者数据 int total; //总包数 int curr; //当前包数 int len; //数据部分的长度 }; 1、recv(socket,buf,sizeof(struct Header)); //读取包头,已获取基本控制信息 struct Header h; memcpy(&h,buf,sizeof(h)); 2、recv(socket,buf,h.len); //读取数据部分 if ( h.msg_type == XX ) { } else { } 你用UDP发一包就是一包.要么收到,要么收不到一个完整的包.不能超过路由长度.如果你要分很多小包一个UDP一个的发.你得自己定义协议.序列号+长度+内容+是否有后序标志 +检验证。