zoukankan      html  css  js  c++  java
  • 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一个的发.你得自己定义协议.序列号+长度+内容+是否有后序标志 +检验证。


  • 相关阅读:
    fedora 安装open office
    git rebase(转)
    javascript typeof
    正则表达式入门
    XML格式
    zz 通用线程:Awk 实例,第 3部分
    ELF BIN HEX
    i2c总线(iic总线/ I square C)
    grep
    把Nginx注册成Windows 系统服务(转载)
  • 原文地址:https://www.cnblogs.com/mylinux/p/3988915.html
Copyright © 2011-2022 走看看