每一个“丑得人神共愤”的泡妞高 手都有一颗坚忍的心,这证明了人类 在绝境中毫不妥协的求生精神,反正丑都丑了,索性放开手脚大干一场,这就叫“无产阶级失去的是锁链,得到的是全世界”
2013年(130)
分类: WINDOWS
2013-08-12 18:43:57
出现这个问题的原因一般是由于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 太旧了,它根本不认得 struct sockaddr_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下进行编译,将工程设置好后,就不会有这种问题(推荐使用这种方法) 。