⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 406.htm

📁 unix高级编程原吗
💻 HTM
📖 第 1 页 / 共 2 页
字号:
    ctl.len = sizeof(struct sockaddr); <br>

    ctl.buf = (char *)&sa; <br>

    bp = buf; <br>

  <br>

    iph.ip_v = IPVERSION; <br>

    iph.ip_hl = 5; /* 20 octets--no options */ <br>

    iph.ip_tos = htons(0);   /* No special service */ <br>

    iph.ip_len = htons(40); <br>

    iph.ip_id = htons(27); /* "unique" identification */ <br>

    iph.ip_off = htons(0); <br>

    iph.ip_ttl = htons(60); <br>

    iph.ip_p = htons(IPPROTO_TCP); <br>

    iph.ip_dst.s_addr = server->sin_addr.s_addr; <br>

    gethostname(buf, 2048); <br>

    he = gethostbyname(buf); <br>



    bcopy((char *)he->h_addr, <br>

          (char *)&iph.ip_src.s_addr, <br>

          sizeof(iph.ip_src.s_addr)); <br>

    iph.ip_sum = 0; <br>

    iph.ip_sum = htons(in_cksum_c(&iph, (iph.ip_hl << 2))); <br>

    bcopy((char *)&iph, bp, sizeof(struct ip)); <br>

    bp += sizeof(struct ip); <br>

    oldbp = bp; <br>

    computed=1; <br>

  } /* if !computed */ <br>

  /* Set up the TCP header */ <br>

  bp = oldbp; <br>

  tcph.th_sport = 5894; /* Random number */ <br>

  tcph.th_dport = server->sin_port; <br>

  tcph.th_seq = 59595; /* Random number */ <br>

  tcph.th_ack = 0; <br>

  tcph.th_off = 5; <br>

  tcph.th_flags = TH_SYN; <br>

  tcph.th_win = 4096; <br>

  tcph.th_sum = 0; <br>

  /* Calculate the TCP checksum on the TCP pseudoheader*/ <br>

  pbp=pbuf; <br>

  pbp=pbuf; <br>

  bcopy((char *)&iph.ip_src.s_addr, pbp, 4); <br>

  pbp+=4; <br>

  bcopy((char *)&iph.ip_dst.s_addr, pbp, 4); <br>

  pbp+=4; <br>

  *pbp=0; <br>

  pbp++; <br>

  *pbp=(char)iph.ip_p; <br>

  pbp++; <br>

  *(u_short *)pbp=(u_short)sizeof(struct tcphdr); <br>

  pbp+=2; /* go past the u_short */ <br>

  bcopy((char *)&tcph, pbp, sizeof(struct tcphdr)); <br>

  pbp+=sizeof(struct tcphdr); <br>

  if ((pbp-pbuf)%2) { <br>

    *pbp=(char)0; <br>

    pbp++; <br>

  } <br>

  tcph.th_sum = htons(in_cksum_c(pbuf, (int)(pbp-pbuf))); <br>

  <br>

  bcopy((char *)&tcph, bp, sizeof(struct tcphdr)); <br>

  bp += sizeof(struct tcphdr); <br>

  <br>

  datah.len = (int)(bp-buf); <br>



  datah.buf = (char *)buf; <br>

  <br>

  if (putmsg(fd, &ctl, &datah, 0) < 0) { <br>

    perror("putmsg (ctl)"); <br>

    switch(errno) { <br>

      case EAGAIN: fprintf(stderr,"EAGAIN\n");break; <br>

      case EBADF: fprintf(stderr,"Bad FD\n");break; <br>

      case EFAULT: fprintf(stderr,"Bad ctlptr or dataptr\n");break; <br>

      case EINTR: fprintf(stderr,"Signal caught\n");break; <br>

      case EINVAL: fprintf(stderr,"undefined flag\n");break; <br>

      case ENOSTR: fprintf(stderr,"No stream\n");break; <br>

      case ENXIO: fprintf(stderr,"hangup downstream\n");break; <br>

      case ERANGE: fprintf(stderr,"data size problem\n");break; <br>

    } <br>

    exit(1); <br>

  } <br>

  /* Now that we've sent the syn, scan all return packets for reply */ <br>

  if (!setjmp(env_buf)) { <br>

    signal(SIGALRM, handle_alarm, -1); <br>

    alarm(1); <br>

    retval=scan_return(fd, &iph, &tcph); <br>

    alarm(0); <br>

    alarm(0); <br>

  } else retval=1; <br>

  return(retval); <br>

} <br>

  <br>

int fakeconnect(server, servername) <br>

/* <br>

 * Fake the connection, return 1 on failure, 0 on success <br>

 */ <br>

struct sockaddr_in *server; <br>

char *servername; <br>

{ <br>

  static int if_fd = -1; <br>

  char *device=0; <br>

  u_long localnet; <br>

  u_long netmask; <br>

  int linktype; <br>

  char *lookup_device(); <br>

  void lookup_net(); <br>

  <br>

  if (if_fd == -1) { <br>

    if (device==0) { <br>

      device = lookup_device(); <br>



      if (device == 0) <br>

        perror("can't find any interfaces"); <br>

    } <br>

    if_fd = initdevice(device, &linktype); <br>

    lookup_net(device, &localnet, &netmask); <br>

  } <br>

  return(send_packet(if_fd, server, servername, localnet, netmask)); <br>

} <br>

  <br>

  <br>

/* ====================== begin nasty NIT stuff ======================= */ <br>

  <br>

  <br>

/* Not all systems have IFF_LOOPBACK */ <br>

#ifdef IFF_LOOPBACK <br>

#define ISLOOPBACK(p) ((p)->ifr_flags & IFF_LOOPBACK) <br>

#else <br>

#define ISLOOPBACK(p) (strcmp((p)->ifr_name, "lo0") == 0) <br>

#endif <br>

  <br>

char *lookup_device() <br>

{ <br>

{ <br>

  struct ifreq ibuf[16], *ifrp, *ifend, *mp; <br>

  struct ifconf ifc; <br>

  int fd; <br>

  int minunit, n; <br>

  char *cp; <br>

  static char device[sizeof(ifrp->ifr_name)]; <br>

  <br>

  fd = socket(AF_INET, SOCK_DGRAM, 0); <br>

  if (fd < 0) { <br>

    perror("newscan: socket"); <br>

    exit(1); <br>

  } <br>

  ifc.ifc_len = sizeof(ibuf); <br>

  ifc.ifc_buf = (caddr_t)ibuf; <br>

  <br>

  if (ioctl(fd, SIOCGIFCONF, (char *)&ifc) < 0 || <br>

      ifc.ifc_len < sizeof(struct ifreq)) { <br>

    perror("newscan: SIOCGIFCONF: "); <br>

    exit(1); <br>

  } <br>

  ifrp = ibuf; <br>

  ifend = (struct ifreq *)((char *)ibuf + ifc.ifc_len); <br>



  <br>

  mp = 0; <br>

  minunit = 666; <br>

  while (ifrp < ifend) { <br>

    struct ifreq ifr; <br>

    /* <br>

     * Need a template to preserve address info that is <br>

     * used below to locate the next entry.  (Otherwise, <br>

     * SIOCGIFFLAGS stomps over it because the requests <br>

     * are returned in a union.) <br>

     */ <br>

    bcopy(ifrp->ifr_name, ifr.ifr_name, sizeof(ifr.ifr_name)); <br>

    if (ioctl(fd, SIOCGIFFLAGS, (char *)&ifr) < 0) { <br>

      fprintf(stderr, "newscan: SIOCGIFFLAGS: "); <br>

      perror(ifrp->ifr_name); <br>

      exit(1); <br>

    } <br>

    if ((ifr.ifr_flags & IFF_UP) && !ISLOOPBACK(&ifr)) { <br>

      for (cp = ifrp->ifr_name; !isdigit(*cp); ++cp) <br>

        ; <br>

      n = atoi(cp); <br>

      if (n < minunit) { <br>



        minunit = n; <br>

        mp = ifrp; <br>

      } <br>

    } <br>

#if BSD >= 199006 <br>

    n = ifrp->ifr_addr.sa_len + sizeof(ifrp->ifr_name); <br>

    if (n < sizeof(*ifrp)) <br>

      ++ifrp; <br>

    else <br>

      ifrp = (struct ifreq *)((char *)ifrp + n); <br>

#else <br>

    ++ifrp; <br>

#endif <br>

  } <br>

  close(fd); <br>

  if (mp == 0) <br>

    return (0); <br>

  <br>

  (void)strcpy(device, mp->ifr_name); <br>

  return (device); <br>

} <br>

  <br>

  <br>

/* <br>

 * Get the netmask of an IP address.  This routine is used if <br>

 * SIOCGIFNETMASK doesn't work. <br>

 */ <br>

static u_long <br>

ipaddrtonetmask(addr) <br>

u_long addr; <br>

{ <br>

  char str[80]; <br>

  <br>

  if (IN_CLASSA(addr)) <br>

    return (IN_CLASSA_NET); <br>

  if (IN_CLASSB(addr)) <br>

    return (IN_CLASSB_NET); <br>

  if (IN_CLASSC(addr)) <br>

    return (IN_CLASSC_NET); <br>

  sprintf(str,"unknown IP address class: %08X", addr); <br>

  perror(str); <br>

  /* NOTREACHED */ <br>

} <br>

  <br>

void <br>

void <br>

lookup_net(device, netp, maskp) <br>

char *device; <br>

u_long *netp; <br>

u_long *maskp; <br>

{ <br>

  int fd; <br>

  struct ifreq ifr; <br>

  struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_addr; <br>

  <br>

  /* Use data gram socket to get IP address. */ <br>

  if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { <br>

    perror("newscan: socket"); <br>

    exit(1); <br>

  } <br>

  (void)strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name)); <br>

  if (ioctl(fd, SIOCGIFADDR, (char *)&ifr) < 0) { <br>

    /* <br>

     * This will fail if an IP address hasn't been assigned. <br>

     */ <br>

    *netp = 0; <br>

    *maskp = 0; <br>

    return; <br>

    return; <br>

  } <br>

  *netp = sin->sin_addr.s_addr; <br>

  if (ioctl(fd, SIOCGIFNETMASK, (char *)&ifr) < 0) <br>

    *maskp = 0; <br>

  else <br>

    *maskp = sin->sin_addr.s_addr; <br>

  if (*maskp == 0) <br>

    *maskp = ipaddrtonetmask(*netp); <br>

  *netp &= *maskp; <br>

  (void)close(fd); <br>

} <br>

  <br>

u_long snaplen = 0; <br>

  <br>

int <br>

initdevice(device,linktype) <br>

char *device; <br>

int *linktype; <br>

{ <br>

  struct strioctl si;             /* struct for ioctl() */ <br>

  struct timeval timeout;         /* timeout for ioctl() */ <br>

  struct ifreq ifr;               /* interface request struct */ <br>



  u_long if_flags;                /* modes for interface             */ <br>

  int  ret; <br>

  /*  int chunksize = (8*1024); */ <br>

  int chunksize = 0; <br>

  int if_fd; <br>

  char *dev = "/dev/nit"; <br>

  int nonblock; <br>

  <br>

  struct ether_header eh; <br>

  struct ip iptest; <br>

  struct packetfilt pf; <br>

  register u_short *fwp = pf.Pf_Filter; <br>

  u_short ethoffset; <br>

  u_short ipoffset; <br>

  u_short masker = 255; <br>

  <br>

  si.ic_timout = INFTIM; <br>

  <br>

  /* Set up the Packet Filter */ <br>

  ethoffset=((u_int)&eh.ether_type-(u_int)&eh.ether_dhost)/(sizeof(u_short)); <br>

  ipoffset = 11; <br>

  *fwp++ = ENF_PUSHZERO; <br>



  *fwp++ = ENF_PUSHWORD + ethoffset; <br>

  *fwp++ = ENF_PUSHLIT; <br>

  *fwp++ = htons(ETHERTYPE_IP); <br>

  *fwp++ = ENF_COR; <br>

  *fwp++ = ENF_PUSHWORD + ipoffset; <br>

  *fwp++ = ENF_PUSHLIT; <br>

  *fwp++ = (u_short)255; <br>

  *fwp++ = ENF_AND; <br>

  *fwp++ = ENF_PUSHLIT; <br>

  *fwp++ = (u_short)6; <br>

  *fwp++ = ENF_COR; <br>

  *fwp++ = ENF_PUSHLIT; <br>

  *fwp++ = (u_short)1; <br>

  <br>

  /* open /dev/nit Read/write */ <br>

  if ((if_fd = open(dev, O_RDWR)) < 0) { <br>

    (void) fprintf(stderr, "newscan: open: "); <br>

    perror(dev); <br>

    exit(-1); <br>

  } <br>

  <br>

  /* arrange to get discrete messages from the STREAM and use NIT_BUF */ <br>



  ioctl(if_fd, I_SRDOPT, (char*)RMSGD); <br>

  <br>

  /* it is important to have this stuff in the stream BEFORE! the nbuf */ <br>

  si.ic_cmd = NIOCSETF; <br>

  si.ic_len = sizeof(struct packetfilt); <br>

  si.ic_dp = (char*)&pf; <br>

  pf.Pf_FilterLen = fwp - &pf.Pf_Filter[0]; <br>

  if (ioctl(if_fd, I_PUSH, "pf")<0) { <br>

    perror("I_PUSH pf"); <br>

    fprintf(stderr,"No pf being used\n"); <br>

  } else { <br>

    if ((ioctl(if_fd, I_STR, (char*)&si)) < 0) { <br>

      perror("newscan: NIOCSETF"); <br>

      /* exit(-1); */ <br>

      fprintf(stderr,"No pf being used (or one already applied)\n"); <br>

    } <br>

  } <br>

  <br>

  ioctl(if_fd, I_PUSH, "nbuf"); <br>

  <br>

  /* set the timeout */ <br>

  timeout.tv_sec = 1; <br>



  timeout.tv_usec = 0; <br>

  si.ic_cmd = NIOCSTIME; <br>

  si.ic_len = sizeof(timeout); <br>

  si.ic_dp = (char*)&timeout; <br>

  if ((ret = ioctl(if_fd, I_STR, (char*)&si)) < 0) { <br>

    perror("newscan: NIOCSTIME"); <br>

    exit(-1); <br>

  } <br>

  <br>

  /* set the chunksize */ <br>

  si.ic_cmd = NIOCSCHUNK; <br>

  si.ic_len = sizeof(chunksize); <br>

  si.ic_dp = (char*)&chunksize; <br>

  if ((ret = ioctl(if_fd, I_STR, (char*)&si)) < 0) { <br>

    perror("newscan: NIOCSCHUNK"); <br>

    exit(-1); <br>

  } <br>

  <br>

  /* Set up the NIT device (bind it,set snapshot length etc) */ <br>

  /* bind the interface */ <br>

  strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name)); <br>

  ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = ' '; <br>



  si.ic_cmd = NIOCBIND; <br>

  si.ic_len = sizeof(ifr); <br>

  si.ic_dp = (char*)&ifr; <br>

  if ((ret = ioctl(if_fd, I_STR, (char*)&si)) < 0) { <br>

    (void) fprintf(stderr, "newscan: NIOCBIND"); <br>

    perror(ifr.ifr_name); <br>

    exit(1); <br>

  } <br>

  <br>

  /* set the snapshot length */ <br>

  si.ic_cmd = NIOCSSNAP; <br>

  si.ic_len = sizeof(snaplen); <br>

  si.ic_dp = (char*)&snaplen; <br>

  if ((ret = ioctl(if_fd, I_STR, (char*)&si)) < 0) { <br>

    perror("newscan: NIOCSSNAP"); <br>

    exit(1); <br>

  } <br>

  <br>

  /* set the interface flags */ <br>

  si.ic_cmd = NIOCSFLAGS; <br>

  if_flags = NI_TIMESTAMP | NI_LEN | NI_DROPS; <br>

  if_flags |= NI_PROMISC; <br>



  si.ic_len = sizeof(if_flags); <br>

  si.ic_dp = (char*)&if_flags; <br>

  if ((ioctl(if_fd, I_STR, (char*)&si)) < 0) { <br>

    perror("newscan: NIOCSFLAGS"); <br>

    exit(1); <br>

  } <br>

  <br>

  nonblock = 1; <br>

  ioctl(if_fd, FIONBIO,&nonblock); <br>

  <br>

  ioctl(if_fd, I_FLUSH, (char*)FLUSHR); <br>

  /* <br>

   * NIT supports only ethernets. <br>

   */ <br>

  *linktype = 1; <br>

  <br>

  return if_fd; <br>

} <br>

  <br>

-- <br>

※ 来源:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: 202.114.208.83] <br>

-- <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="316.htm">上一层</a>][<a href="407.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -