int main(int argc ,char *argv[])
{
#include <pcap.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
/*
struct timeval{
long int tv_sec; // 秒数
long int tv_usec; // 微秒数
}
*/
static struct timeval old_time;
static int send_total_num = 0;
static int recv_total_num = 0;
static void sig_usr1_handler()
{
printf("recv_total_num = %d\n",recv_total_num);
if(send_total_num != 0)
{
printf("loss %d\t loss% = %d%%\n",send_total_num - recv_total_num,(send_total_num - recv_total_num)*100/send_total_num );
}
exit(0);
}
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)///回调函数
{
struct tm *ltime;
time_t local_tv_sec;
//printf("start : %d.%d\n", header->ts.tv_sec, header->ts.tv_usec);
if(((header->ts.tv_sec - old_time.tv_sec)*1000000 +(header->ts.tv_usec - old_time.tv_usec)) > 40*1000)
{
printf("%d\n",((header->ts.tv_sec - old_time.tv_sec)*1000000 +(header->ts.tv_usec - old_time.tv_usec)));
}
old_time.tv_sec = header->ts.tv_sec;
old_time.tv_usec = header->ts.tv_usec;
recv_total_num++;
//local_tv_sec = header->ts.tv_sec;
//打印数据包的时间戳和长度
//printf("%s len: %d", ctime(&local_tv_sec), header->len);
//printf("%s \n", ctime(&local_tv_sec));
}
int main(int argc ,char *argv[])
{
signal(SIGUSR1, sig_usr1_handler);
signal(SIGINT, sig_usr1_handler);
recv_total_num = 0;
if(argc == 2)
{
send_total_num = atoi(argv[1]);
}
pcap_t *handle; /* 会话句柄 */
int ret ;
//char *dev; /* 执行嗅探的设备 */
char dev[] = "GE4"; /* 执行嗅探的设备 */
char errbuf[PCAP_ERRBUF_SIZE]; /* 存储错误信息的字符串 */
struct bpf_program filter; /* 已经编译好的过滤器 */
//char filter_app[] = "dst host 5ff1::6"; /* 过滤表达式 */
char filter_app[] = "src host 1ff1::6"; /* 过滤表达式 */
bpf_u_int32 mask; /* 所在网络的掩码 */
bpf_u_int32 net; /* 主机的IP地址 */
struct pcap_pkthdr header; /* 由pcap.h定义 */
const u_char *packet; /* 实际的包 */
/* Define the device */
//dev = pcap_lookupdev(errbuf);
pcap_lookupnet(dev, &net, &mask, errbuf);
printf("dev = %s\n",dev);
/* 探查设备属性 */
pcap_lookupnet(dev, &net, &mask, errbuf);
/* 以混杂模式打开会话 */
handle = pcap_open_live(dev, BUFSIZ, 1, 0, errbuf);
/* 编译并应用过滤器 */
pcap_compile(handle, &filter, filter_app, 0, net);
pcap_setfilter(handle, &filter);
while(1){
#if 0
/* 截获一个包 */
packet = pcap_next(handle, &header);
/* 打印它的长度 */
printf("Jacked a packet with length of [%d]\n", header.len);
#endif
ret = pcap_loop(handle, 1, packet_handler, NULL);
}
/* 关闭会话 */
pcap_close(handle);
return(0);
}
编译:
gcc test_pcap.c -lpcap -o test_pcap
另一端使用xcap发包工具发包,发送间隔为1毫秒