天天看點

BCB解析ICMPV6_ECHO_REPLY

做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類型的變量。

繼續閱讀