读书人

小弟我写了个基于LIBNET的小程序但是

发布时间: 2012-03-07 09:13:51 作者: rapoo

求教:我写了个基于LIBNET的小程序,但是数据包的数量定制有问题。
我写了个基于LIBNET的小程序,但是数据包的数量定制有问题。
主要是当我选择数据包一次发送超过1000个时,ARP包就会提示产生libnet_init()的初始化错误,可能大家对这个程序的应用函数库不是很熟悉,我是想问问各位高手,会不会是因为我使用的FOR循环造成的?或者我的常变量定义中是不是有缺陷? 我对C语言中指针的操作确实不是太熟悉,露怯了,以下是部分代码: 这里只贴了ARP部分,后面还有几个数据包的选择,大同小异,就懒得贴了,求教高手了,我猜可能是指针对内存的操作上有问题导致的,可限于水平自己找不出。。

int
main(int argc, char *argv[])
{
int j=0,k=0; //循环初值
int packet_length; //数据包长度
int src_prt, dst_prt; //源/目的地址端口号
int tmp[6]; //源MAC地址输入临时存储
char choose ; //数据包选择
char label[LIBNET_LABEL_SIZE]; //句柄字符串标记

u_char enet_dst[6] = {0x00, 0x10, 0x67, 0x00, 0xb1, 0x86}; //目的MAC地址常量
u_char payload[100]; //负载内容


u_long payload_s =100; //负载长度
u_long src_ip, dst_ip; //源/目的IP地址

u_char enet_src[6]; //源MAC地址
u_int32_t i; //网络字节顺序地址
// u_int8_t *packet;
// u_int32_t packet_s;

libnet_t *l;
libnet_ptag_t t;

char *device = NULL;
char errbuf[LIBNET_ERRBUF_SIZE];
printf( "请输入发送的数据包类型\n(1)ARP数据包\n(2)ICMP超时数据包\n(3)TCP数据包\n(4)退出\n ");
scanf( "%c ",&choose);
while (choose <49||choose> 52)
{ printf( "输入错误,请重新选择!\n ");
printf( "请输入发送的数据包类型\n(1)ARP数据包\n(2)ICMP超时数据包\n(3)TCP数据包\n(4)退出\n ");
scanf( "%c ",&choose);
}

if (choose==52){
printf( "程序已退出\n ");
return (EXIT_FAILURE); }

if (choose==49){

int numberARP ;
char ipadd[20];
u_char *macdst[6];
u_char *macsrc[6];

printf( "请输入发送的数据包数量\n ");
scanf( "%d ",&numberARP);

if (numberARP <=0)


{
printf( "数据包数量输入错误,请重新开始\n ");
return (EXIT_FAILURE);
}
printf( "请输入MAC地址\n 例如: 0x0d 0x0e 0x0a 0x0d 0x00 0x00\n ");
for(k=0; k <6; k++)
scanf( "%x ", &tmp[k]);
for(k=0; k <6; k++)
enet_src[k] = tmp[k]&0xff;

printf( "请输入构造的ARP地址\n 例如:192.168.0.1\n ");
scanf( "%s ",ipadd);

printf( "请输入发送的数据包内容\n ");
scanf( "%s ",&payload);

if (argc > 1)
{
device = argv[1];
}


for (k=0;k < numberARP;k++)
{
l = libnet_init(
LIBNET_LINK_ADV, /* injection type */
device, /* network interface */
errbuf); /* errbuf */

if (l == NULL)
{
fprintf(stderr, "libnet_init() 初始化失败:\n %s\n ", errbuf);

goto badARP;
}

i=libnet_name2addr4(l,ipadd,0);


if (i==-1)
{
fprintf(stderr, "IP地址输入错误,请重新开始\n ", errbuf);

goto badARP;
}

t = libnet_build_arp(
ARPHRD_ETHER, /* hardware addr */


ETHERTYPE_IP, /* protocol addr */
6, /* hardware addr size */
4, /* protocol addr size */
ARPOP_REPLY, /* operation type */
enet_src, /* sender hardware addr */
(u_int8_t *)&i, /* sender protocol addr */
enet_dst, /* target hardware addr */
(u_int8_t *)&i, /* target protocol addr */
NULL, /* payload */
0, /* payload size */


l, /* libnet context */
0); /* libnet id */
if (t == -1)
{
fprintf(stderr, "ARP报头构造失败: %s\n ", libnet_geterror(l));
goto badARP;
}

t = libnet_autobuild_ethernet(
enet_dst, /* ethernet destination */
ETHERTYPE_ARP, /* protocol type */
l); /* libnet handle */
if (t == -1)
{
fprintf(stderr, "以太网报头构造失败: %s\n ",
libnet_geterror(l));
goto badARP;
}

snprintf(label, sizeof(label) - 1, "第 %d 个 ", k);

libnet_cq_add(l, label);
}
for (l = libnet_cq_head(); libnet_cq_last(); l = libnet_cq_next())

{ j++;
packet_length = libnet_write(l);
printf( "发送第 %d 个%d字节长度的ARP数据包,其对应的libnet句柄为\ "%s\ "\n ", j, packet_length, libnet_cq_getlabel(l));
}


libnet_destroy(l);
return (EXIT_SUCCESS);

badARP:

libnet_destroy(l);
return (EXIT_FAILURE);
}

[解决办法]
帮项下。
[解决办法]
我也碰到这个问题。libnet_init初始化后的l 超过1020左右的时候就会出错。
最后解决的办法是:
没有用libnet_cq_add
采用
for (k=0;k < numberARP;k++)
{
l = libnet_init()
......
libnet_write(l);
libnet_destroy(l)
}



[解决办法]
我也遇到,怎麽解呢?上的方法也不好,我得在于,
l= libnet_init(LIBNET_LINK_ADV,device, errbuf); 函,在循中重使用了多次,致出,我了一下,跟卡的有。 具什麽,我也搞不清楚,要不一下。

读书人网 >C语言

热点推荐