Chinaunix首页 | 论坛 | 博客
  • 博客访问: 731637
  • 博文数量: 130
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 2198
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-29 12:48
个人简介

每一个“丑得人神共愤”的泡妞高 手都有一颗坚忍的心,这证明了人类 在绝境中毫不妥协的求生精神,反正丑都丑了,索性放开手脚大干一场,这就叫“无产阶级失去的是锁链,得到的是全世界”

文章分类

全部博文(130)

文章存档

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下进行编译,将工程设置好后,就不会有这种问题(推荐使用这种方法)

阅读(3387) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~