internet.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:3k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <netinet/in.h>
  4. #include <netinet/in_systm.h>   
  5. #include <netinet/ip.h>
  6. #include <netinet/ip_icmp.h>
  7. #include <netinet/ip_icmp.h>
  8. #include <arpa/inet.h>
  9. #include "emulate/internet.h"
  10. #include "scheduler.h"
  11. /*  
  12.  * in_cksum --
  13.  *      Checksum routine for Internet Protocol family headers (C Version)
  14.  *      [taken from ping.c]
  15.  */ 
  16. u_short  
  17. Internet::in_cksum(u_short* addr, int len)
  18. {   
  19.         register int nleft = len;       
  20.         register u_short *w = addr;
  21.         register int sum = 0;
  22.         u_short answer = 0;
  23.     
  24.         /*                      
  25.          * Our algorithm is simple, using a 32 bit accumulator (sum), we add
  26.          * sequential 16 bit words to it, and at the end, fold back all the
  27.          * carry bits from the top 16 bits into the lower 16 bits.
  28.          */      
  29.         while (nleft > 1)  {
  30.                 sum += *w++;
  31.                 nleft -= 2;
  32.         }       
  33.     
  34.         /* mop up an odd byte, if necessary */
  35.         if (nleft == 1) {
  36.                 *(u_char *)(&answer) = *(u_char *)w ;
  37.                 sum += answer;
  38.         }
  39.         /* add back carry outs from top 16 bits to low 16 bits */
  40.         sum = (sum >> 16) + (sum & 0xffff);     /* add hi 16 to low 16 */
  41.         sum += (sum >> 16);                     /* add carry */
  42.         answer = ~sum;                          /* truncate to 16 bits */
  43.         return(answer);
  44. }
  45. #include <netinet/in_systm.h>
  46. #include <netinet/ip.h>
  47. void
  48. Internet::print_ip(ip *ip)
  49. {   
  50.         u_short off = ntohs(ip->ip_off);
  51.         printf("IP v:%d, ihl:%d, tos:0x%x, id:%d, off:%d [df:%d, mf:%d], "
  52.        "sum:%d, prot:%dn",
  53.                 ip->ip_v, ip->ip_hl, ip->ip_tos, ntohs(ip->ip_id),
  54.                 off & IP_OFFMASK,
  55.                 (off & IP_DF) ? 1 : 0,
  56.                 (off & IP_MF) ? 1 : 0,
  57.                 ip->ip_sum, ip->ip_p);
  58. printf("IP src:%s, ", inet_ntoa(ip->ip_src));
  59. printf("dst: %sn", inet_ntoa(ip->ip_dst));
  60.         printf("IP len:%d ttl: %dn",
  61.                 ntohs(ip->ip_len), ip->ip_ttl);
  62. }   
  63. /*
  64.  * cons up a basic-looking ip header, no options
  65.  * multi-byte quantities are assumed to be in HOST byte order
  66.  */
  67. void
  68. Internet::makeip(ip* iph, u_short len, u_char ttl, u_char proto, in_addr& src, 
  69. in_addr& dst)
  70. {
  71.         u_char *p = (u_char*) iph;
  72.         *p = 0x45;      /* ver + hl */
  73.         iph->ip_tos = 0;
  74.         iph->ip_len = htons(len);
  75.         iph->ip_id = (u_short) Scheduler::instance().clock();   // why not?
  76.         iph->ip_off = 0x0000;   // mf and df bits off, offset zero
  77.         iph->ip_ttl = ttl;
  78.         iph->ip_p = proto;
  79.         memcpy(&iph->ip_src, &src, 4);
  80.         memcpy(&iph->ip_dst, &dst, 4);
  81.         iph->ip_sum = Internet::in_cksum((u_short*) iph, 20);
  82.         return;
  83. }