0

我在 ns2 上工作...在 aodv.cc 中做了一些更改并添加了我自己的一些功能

void nb_traffic_update(int id,struct nb_traffic_stat **nblist,int nid,int flag,int hop_count)

..检测沉洞攻击..当我运行具有少量节点的代码时,我得到了结果,但是当我增加节点数时,我得到分段错误。这是我的 nb_traffic.h 文件

    struct nb_traffic_stat
    {
        int id;
        int recvrequest;
        int routereply;
        int no_of_hops;
        //int no_of_updation;
        struct nb_traffic_stat *next;
    };
    struct traffic_stat
    {
       int id;
       struct nb_traffic_stat **list;
       struct traffic_stat *next;
    };
    struct ftraffic_stat
    {
       int sendrequest;
       int routereply;
    };

修改 aodv.cc

    struct traffic_stat *tlist=NULL,*ttail=NULL;
    void
    AODV::recvReply(Packet *p) {
    ...
    if (ih->daddr() == index) { // If I am the original source
    .....

    nb_traffic_update(index,&nblist,ih->saddr(),1,rp->rp_hop_count);//1 is for   receiving the route reply

     }
    } 

    void
    AODV::recvRequest(Packet *p) {
    ....
    /*after ensuring this is the new routerequest*/

    struct hdr_cmn *ch = HDR_CMN(p);
    if(ch->num_forwards()==1)
    {
       nb_traffic_update(index,&nblist,rq->rq_src,0,0);//0 is for receiving the request
    }
   }

我的邻居流量更新功能

   void nb_traffic_update(int id,struct nb_traffic_stat **nblist,int nid,int flag,int  hop_count)
    {
       int n;
       //printf("inside nb_traffic_update:%d\n",id);
       if(*nblist==NULL)
       {
           struct nb_traffic_stat *ptr;
           ptr=(struct nb_traffic_stat*)malloc(sizeof(struct nb_traffic_stat));
           ptr->id=nid;
           ptr->next=NULL;
           if(flag==0)
           {
         ptr->recvrequest=1;
             ptr->routereply=0;
             ptr->no_of_hops=0;
            //ptr->no_of_updation=0;
           }
           else 
           {
             ptr->recvrequest=0;
             ptr->routereply=1;
             ptr->no_of_hops=hop_count;
             //ptr->no_of_updation=1;
           }
           *nblist=ptr;
           struct traffic_stat *sptr;
           sptr=tlist;
           while(sptr!=NULL&&sptr->id!=id)
           {
              sptr=sptr->next;
           }
           assert(sptr!=NULL);
           sptr->list=nblist;
      }
     else
     {
        int found=0;
        struct nb_traffic_stat *tptr,*prevtptr;
        tptr=*nblist;
        while(tptr!=NULL&&tptr->id<=nid)
        {
            if(tptr->id==nid)
           {
              found=1;
              break;
           }
           prevtptr=tptr;
           tptr=tptr->next;
        }
        if(found)
        {
          if(flag==0)
          {
           tptr->recvrequest++;
          }
          else 
          {
              tptr->routereply++;
              tptr->no_of_hops=hop_count;
              //tptr->no_of_updation++;
          }

        }
        else
        {
            struct nb_traffic_stat *ptr;
            ptr=(struct nb_traffic_stat*)malloc(sizeof(struct nb_traffic_stat));
            ptr->id=nid;
            if(flag==0)
            {
          ptr->recvrequest=1;
              ptr->routereply=0;
              ptr->no_of_hops=0;
              //ptr->no_of_updation=0;
            }
            else 
            {
              ptr->recvrequest=0;
              ptr->routereply=1;
              ptr->no_of_hops=hop_count;
              //ptr->no_of_updation=1;
            }
            ptr->next=prevtptr->next;
            prevtptr->next=ptr;
         }

        } 
       }
4

2 回答 2

1

您没有nblist在函数内部检查是否为 NULL nb_traffic_update(int, nb_traffic_stat**, int, int, int),这会导致段错误。

if (*nblist==NULL)同样在您正在执行的条件语句中: *nblist=ptr;. 这意味着*NULL = ptr;可能导致段错误。

于 2013-03-31T06:49:58.433 回答
1

使用 gdb 运行 tcl,它将显示导致段错误的函数...

例如,gdb -args ns path/to/tcl/script.tcl

于 2013-12-05T08:45:33.650 回答