C语言 毫秒级丢包率,路由收敛时长测试

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毫秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值