这是我定义的ICMP头
// ICMP header
typedef struct _tagX_icmphdr
{
unsigned char i_type;
unsigned char i_code;
unsigned short i_cksum;
unsigned short i_id;
unsigned short i_seq;
unsigned long i_timestamp;
}XIcmpHeader;XIcmpHeader  icmp
但是当我用Sendto(...,&icmp,sizeof(XIcmpHeader ),...);这我怀疑 因为要是按照VC的默认的字节对齐方式,sizeof(XIcmpHeader )得到的值肯定不是12 比这大 。那当我把这比12字节大的信息头的信息发过去  。 那不就出现了严重的问题 :IP协议栈不能将其对齐产生错误。但是我看好多人就是这样写的???

解决方案 »

  1.   


    这样试下,我一般都是这样写的,防止4字节对齐
    #pragma pack(push) 
    #pragma pack(1)typedef struct _tagX_icmphdr 

    unsigned char i_type; 
    unsigned char i_code; 
    unsigned short i_cksum; 
    unsigned short i_id; 
    unsigned short i_seq; 
    unsigned long i_timestamp; 
    }XIcmpHeader; #pragma pack(pop)
      

  2.   

    ICMP没有用过,不过在tcp流式套接字里边,你的服务端和客户端都用同样的结构体不就可以了,不存在对齐不对齐的问题,到了另一端就解析.不过你得注意,必须让发送的大小和接受的大小相同.
      

  3.   

    ICMP头 
    它这个信息头 要网络主机 解析吧! 所以要强制 1 字节对齐哦!如果是 2台计算机间数据传递,只要两边定义的结构大小一样就不会有影响!
    但是 tcmp头 要被路由器这些解析 跟 2台电脑间传送数据不同
      

  4.   

    添加一个断言
    assert(sizeof(XIcmpHeader)=12);如果你的编译选项采用的是 8字节对齐,那么这里就会产生断言,否则就能正常工作。
      

  5.   

    #pragma pack(push)
    #pragma pack(1)
    /* 结构体定义 */
    #pragma pack(pop)