网络协议 -- 常用网络协议首部结构体

在定义协议首部数据结构时,需要考虑字节对齐、大小端的问题,可以参考:
彻底理解内存对齐
大端(Bid Endian)、小端(Little Endian)含义

大小端的判断使用了rtc_base/basictypes.h头文件中提供的宏RTC_ARCH_CPU_LITTLE_ENDIANRTC_ARCH_CPU_BIG_ENDIAN

结构体定义如下:

#ifndef RTC_NETWORK_PROTOCOL_HEADER_H_
#define RTC_NETWORK_PROTOCOL_HEADER_H_

#include "rtc_base/basictypes.h"

// in Unix os, see ip.h

#ifdef WIN32
#define __u8 unsigned char
#define __u16 unsigned short
#define __u32 unsigned long

#pragma pack(1)

// See: http://blog.csdn.net/china_jeffery/article/details/78984477#t0
//
struct iphdr {
#if defined RTC_ARCH_CPU_LITTLE_ENDIAN
    __u8 ihl : 4,
        version : 4;
#elif defined RTC_ARCH_CPU_BIG_ENDIAN
    __u8 version : 4,
        ihl : 4;
#else
#error "please fix "
#endif
    __u8 tos;
    __u16 tot_len;
    __u16 id;
    __u16 frag_off;
    __u8 ttl;
    __u8 protocol;
    __u16 check;
    __u32 saddr;
    __u32 daddr;
    /*The options start here. */
};

// See: http://blog.csdn.net/china_jeffery/article/details/79045630
//
struct icmp_common_hdr {
    __u8 type;
    __u8 code;
    __u16 check;
    /*Other content start here. */
};

struct ping_hdr {
    icmp_common_hdr common_hdr;
    __u16 id;
    __u16 seq;
};

#pragma pack()

#endif


#endif // RTC_NETWORK_PROTOCOL_HEADER_H_

IP首部iphdr结构体定义模仿了linux源码ip.h中的iphdr结构体的定义。
icmp_common_hdr定义了ICMP首部通用的4字节。
ping_hdr结构体是icmp_common_hdr的扩展,通常完整的ping包还会在ping首部结构体的后面加上发送时间戳、填充数据等。

完整的networkprotocolheader.h见:https://gitee.com/mediaCloud/webrtc/blob/master/src/rtc_base/networkprotocolheader.h

你可能感兴趣的:(☆,网络编程,网络协议)