首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

小弟我写了个基于LIBNET的小程序,但是数据包的数量定制有有关问题

2012-03-07 
求教:我写了个基于LIBNET的小程序,但是数据包的数量定制有问题。我写了个基于LIBNET的小程序,但是数据包的

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

热点排行