WinPcap编程错误:error C2079: 'IPAddress' uses undefined struct 'sockaddr_storage的解决办法

来源:互联网 发布:个人信用查询软件 编辑:程序博客网 时间:2024/05/22 07:07

出现这个问题的原因一般是由于Winsock的版本和IPv4和IPv6的版本兼容性问题。由于新版的 Winpcap 完全使用了新的 Winsock(支持IPv6),因此这个问题可能影响到每一个已有程序。

 

以下是新旧两版的 packet32.h 之间的差异:

【新版本】

typedef struct npf_if_addr {
    struct sockaddr_storage IPAddress;    ///< IP address.
    struct sockaddr_storage SubnetMask;    ///< Netmask for that address.
    struct sockaddr_storage Broadcast;    ///< Broadcast address.
}npf_if_addr;

 

【旧版本】

typedef struct npf_if_addr {
 struct sockaddr IPAddress; ///< IP address.
 struct sockaddr SubnetMask; ///< Netmask for that address.
 struct sockaddr Broadcast; ///< Broadcast address.
}npf_if_addr;

 

很多人如果仍然使用 Visual C++6 编译程序,那就非常不幸的出现了“error C2079: 'IPAddress' uses undefined struct 'sockaddr_storage”的问题了,这是由于VC6中的 winsock2.h 太旧了,它根本不认得 structsockaddr_storage。因此,winpcap 自带的例程在VC6下编译时会无情地抛出无数错误。事实上,该结构完全可以使用老的sockaddr 代替。手工改动 packet32.h,将 sockaddr_storage 换成sockaddr,这样编译可以顺利通过。但是这种操作的方法有个问题,那就是这样的代码自法支持IPv6。

 

解决方法:
1.在winpcap库的packet32.h文件里面加入代码(且位于“struct npf_if_addr”定义之前):
#ifndef _SS_PAD1SIZE
struct sockaddr_storage {
u_char sa_len;
u_char sa_family;
u_char padding[128];
};
#endif


2.sockaddr_storage 改成 sockaddr

 

3.将工程移植到VS2005下进行编译,将工程设置好后,就不会有这种问题(推荐使用这种方法)

 

原创粉丝点击