求教:我写了个基于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); 這個函數,在循環中並重復使用了多次,導致問題出現,我試驗了一下,跟網卡的驅動還有關係。 具體什麽問題,我也搞不清楚,要不討論一下。