libnet使用问题解决

1. 源代码

libnet源代码可以在http://sourcecodebrowser.com/libnet/1.1.2.1/libnet-functions_8h.html中查询到,包括各个函数的调用关系等。

2. 环境搭建、安装使用

待完善

3. 遇到的问题

1. 内存泄露

构造报文时,利用libnet_pblock_coalesce(libnet_t *l, u_int8_t **packet, u_int32_t *size)构造报文,它会分配内存,存储报文内容,返回packet中,但没有释放内存的函数,持续构造并发送大量报文时,会出现错误信息:libnet_pblock_coalesce(): malloc(): Visual C++ CRT: Not enou
gh memory to complete call to strerror.
代码如下:

int  rc_tester_create_packet(int id)
{
    int packet_num = 0;
    if(libnet_pblock_coalesce(l, &packet[packet_count], &packet_s[packet_count]) == -1)
    {
        printf("Can't build packet: %s\n", libnet_geterror(l));
        return EXIT_FAILURE;
    }
    packet_num = packet_count;
    if ((packet_count < (PACKET_NUM-1)) && (packet_count >= 0)) //报文全部存在一个指针数组中,循环使用
    {
        packet_count ++;
    }
    else
    {
        packet_count = 0;
    }
    libnet_cq_destroy();
    libnet_clear_packet(l);
    return packet_num;
}

解决办法:
libnet还提供了其他的生成报文的接口,比如libnet_adv_cull_packet (libnet_t *l, u_int8_t **packet, u_int32_t *packet_s),它有对应的报文释放函数libnet_adv_free_packet (libnet_t *l, u_int8_t *packet),修改这个函数,发送完把报文释放即可

int  rc_tester_create_packet_(int id)
{
    int packet_num = 0;
    //构造报文
    if(id==0 && (libnet_adv_cull_packet(l, &packet[packet_count], &packet_s[packet_count]) == -1))
    {
        printf("libnet_adv_cull_packet Can't build packet: %s\n", libnet_geterror(l));
        return EXIT_FAILURE;
    }

    packet_num = packet_count;
    if ((packet_count < (PACKET_NUM-1)) && (packet_count >= 0))
    {
        packet_count ++;
    }
    else
    {
        packet_count = 0;
    }
    libnet_cq_destroy();
    libnet_clear_packet(l);
    return packet_num;
}

释放如下:

void  libnet_adv_free_packet_(int id)
{
    if(l->injection_type == LIBNET_LINK_ADV)
        libnet_adv_free_packet(l, packet[id]);
}

还是要好好学学Libnet的各个函数使用,找了两天才搞定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值