函数名称:int pcap_loop(pcap_t * p,int cnt, pcap_handler callback, uchar * user);
函数功能:捕获数据包,不会响应pcap_open_live()函数设置的超时时间
参数说明:p 是由pcap_open_live()返回的所打的网卡的指针;cnt用于设置所捕获数据包的个数;pcap_handler 是与void packet_handler()使用的一个参数,即回调函数的名称;user值一般为NULL
pcap_loop原型是pcap_loop(pcap_t *p,int cnt,pcap_handler callback,u_char *user)
其中第一个参数是winpcap的句柄,第二个是指定捕获的数据包个数,如果为-1则无限循环捕获。第四个参数user是留给用户使用的。第三个是回调函数其原型如下:
pcap_callback(u_char* argument,const struct pcap_pkthdr* packet_header,const u_char* packet_content)
其中参数packet_content表示的捕获到的数据包的内容参数argument是从函数pcap_loop()传递过来的。
注意:这里的参数就是指 pcap_loop中的 *user 参数参数
pcap_pkthdr 表示捕获到的数据包基本信息,包括时间,长度等信息.
另外:回调函数必须是全局函数或静态函数,其参数默认,
比如pcap_loop()可以写成pcap_loop(pcap_handle,10,pcap_callback,NULL)不能往里面传递实参.
-----------------------------------------------------------------------------------------------------------------
pcap_loop和callback之间参数存在联系:pcap_loop的最后一个参数user是留给用户使用的,当callback被调用的时候这个值会传递给callback的第一个参数(也叫user),callback的最后一个参数p指向一块内存空间,这个空间中存放的就是pcap_loop抓到的数据包。callback的第二个参数是一个结构体指针,该结构体定义如下:
struct pcap_pkthdr
{struct timeval ts; /* 时间戳 */
bpf_u_int32 caplen; /* 已捕获部分的长度 */
bpf_u_int32 len; /* 该包的脱机长度 */
这个结构体是由pcap_loop自己填充的,用来取得一些关于数据包的信息所以,在callback函数当中只有第一个user指针是可以留给用户使用的,如果你想给callback传递自己参数,那就只能通过pcap_loop的最后一个参数user来实现了
函数名称:int pcap_loop(pcap_t * p,int cnt, pcap_handler callback, uchar * user);函数功能:捕获数据包,不会响应pcap_open_live()函数设置的超时时间参数说明:p 是由pcap_open_live()返回的所打的网卡的指针;cnt用于设置所捕获数据包的个数;pcap_handler 是与void packet
pcap
_l
oop
:
int
pcap
_l
oop
(
pcap
_t *p, int cnt,
pcap
_
handler
callback
, u_char *user);
这里
pcap
_l
oop
的作用是抓包,每抓到一个包之后就调用
callback
函数
来处理之,
callback
需要你自己编写,call
函数
原型
#include <
pcap
/
pcap
.h>
typedef
void
(*
pcap
_
handler
)(u_char *user, const struct
pcap
_pkthdr *h, const u_char *bytes);
int
pcap
_l
oop
(
pcap
_t *p, int cnt,
pcap
_hand
下面开始正式讲解如何使用lib
pcap
:
首先要使用lib
pcap
,我们必须包含
pcap
.h头文件,可以在/usr/local/include/
pcap
/
pcap
.h找到,其中包含了每个类型定义的详细说明。
1.获取网络接口
首先我们需要获取监听的网络接口:
我们可以手动指定或让lib
pcap
自动选择,先介绍如何让lib
pcap
自动选择:char *
pcap
_lookupdev(char * errbuf)上面这个
函数
返回第一个合适的网络接口的字符串指针,如果出错,则errbuf存放出错信息字符串,e.
void
packet
_
handler
(u_char *param, const struct
pcap
_pkthdr *header, const u_char *pkt_data);
int main()
pcap
_if_t *alldevs;
pcap
_if_t *d;
int inum;
int i=0;
pcap
_t *
首先,该文章不限定OS不单针对Win
pcap
或者lib
pcap
,对于Win
pcap
的特殊扩展使用了PS标示。
我以前使用过Win
pcap
,但并没有对
pcap
开发进行过深入解析。希望这篇文章可以深入浅出的讲清楚这个问题。
Pcap
是什么?它是个监视器,或者发生器,它可以监视,也可以发生,但它不能拦截。它可以在网络上增加一些消息,但不能阻止已经存在的消息。
获取设备列表
static
void
process_
packet
(u_char *user, struct
pcap
_pkthdr *pHeadr, u_char *pkt_data) { // 如果process_
packet
定义在类中,那么必须以static修饰
2.
pcap
_dispatch和
pcap
_l
oop
函数
参数都一样:
int pkts_read = -1; // 让lib
pcap
一直抓包,如果pkts
最近开发一个项目,发现wincap会有丢包现象,与wincap的具体应用是这样的,一个接收线程,采用
pcap
_l
oop
接收网络中的数据包,一个发送线程,采用
pcap
_sendqueue_transmit的方式发送数据包,
pcap
_l
oop
接收包速率大约为34k/s(包数大约150包每秒),
pcap
_sendqueue_transmit发送包的速率大约为每秒100包,在网上查了下wincap性
本系统前台使用的是HTML技术,后台使用JSP语言和MySQL数据库开发,为各位病人及医务工作者提供了医院公告查询、医生信息查看、患者病情管理等多种功能,让人们不需要再通过拿着自己的纸质病历前往医院就可以进行了历史就诊信息的查看,在极大地满足病人们进行在线健康管理的需求的同时,还在首页中添加了X光片子的查看等功能,让病人用户们可以自行进行X光片子的查看。
本系统共分为两个角色,管理员用户负责各个模块的数据管理,比如可以添加和删除医生和患者信息、病历信息等,而患者用户可以在前台界面详细地了解医院的公告信息和各科室的信息,还可以进行在线的病历信息录入和X光片信息的查看。医生用户可以对自己的个人资料进行修改,还可以对病人的信息及病历信息进行查看和管理。
关键词:病历管理;JSP;HTML;MYSQL
要终止使用
pcap
_l
oop
()
函数
进行抓包,你可以在循环中设置一个退出条件,然后在满足该条件时使用
pcap
_breakl
oop
()
函数
来终止抓包。
下面是一个使用
pcap
_l
oop
()
函数
进行抓包并终止的示例代码:
#include <stdio.h>
#include <
pcap
.h>
#define MAX_
PACKET
S 10
void
packet
_
handler
(unsigned char *param, const struct
pcap
_pkthdr *header, const unsigned char *pkt_data) {
// 处理抓到的数据包
printf("
Packet
captured.\n");
int main() {
char errbuf[
PCAP
_ERRBUF_SIZE];
pcap
_t *handle;
int
packet
_count = 0;
// 打开网络接口并设置过滤器
handle =
pcap
_open_live("eth0", BUFSIZ, 1, 1000, errbuf);
if (handle == NULL) {
printf("Error opening device: %s\n", errbuf);
return 1;
// 开始抓包
pcap
_l
oop
(handle, MAX_
PACKET
S,
packet
_
handler
, NULL);
// 终止抓包
pcap
_breakl
oop
(handle);
// 关闭网络接口
pcap
_close(handle);
return 0;
在上面的示例代码中,我们使用
pcap
_l
oop
()
函数
来捕获最多 MAX_
PACKET
S 个数据包。在
packet
_
handler
()
函数
中处理每个抓到的数据包。
使用
pcap
_breakl
oop
()
函数
来终止抓包。在这个示例中,我们使用 MAX_
PACKET
S 作为循环的退出条件,在抓到指定数量的数据包后调用
pcap
_breakl
oop
()
函数
来终止抓包。
注意,
pcap
_breakl
oop
()
函数
的调用必须在
pcap
_l
oop
()
函数
之后,否则它将没有任何效果。