BCB解析ICMPV6_ECHO_REPLY

来源:互联网 发布:界面设计用什么软件 编辑:程序博客网 时间:2024/05/28 23:12

做IPv6 Ping功能,用到Icmp6SendEcho2和Icmp6ParseReplies。获得ICMPV6_ECHO_REPLY的结构后,取地址,结果不对。

发现是因为地址对齐引起。

ICMPV6_ECHO_REPLY的头文件定义如下:

#include <packon.h>
typedef struct _IPV6_ADDRESS_EX {
    USHORT sin6_port;
    ULONG  sin6_flowinfo;

    USHORT sin6_addr[8];
    ULONG  sin6_scope_id;
} IPV6_ADDRESS_EX, *PIPV6_ADDRESS_EX;
#include <packoff.h>


typedef struct icmpv6_echo_reply_lh {
    IPV6_ADDRESS_EX Address;    // Replying address.
    ULONG Status;               // Reply IP_STATUS.
    unsigned int RoundTripTime; // RTT in milliseconds.
    // Reply data follows this structure in memory.
} ICMPV6_ECHO_REPLY_LH, *PICMPV6_ECHO_REPLY_LH;


typedef ICMPV6_ECHO_REPLY_LH ICMPV6_ECHO_REPLY;
typedef ICMPV6_ECHO_REPLY_LH *PICMPV6_ECHO_REPLY;

问题就在#include <packon.h>, 这个头文件定义了在某些条件下#progma pack(1), 指定以1字节对齐。但是对于BCB来说,这个头文件虽然被包含,但是却没有满足这些条件,所以不会定义#progma pack(1)。 这样,BCB解析的时候,sin6_flowinfo不会从第三个字节开始,而是因为地址对齐从第5个字节开始,引起sin6_addr结果错误。


可以人为在需要的地方#progma pack(1),也可以自己写一个结构,重定义sin6_flowinfo为两个USHORT类型的变量。