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的各个函数使用,找了两天才搞定。