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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1991 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted
  6.  * provided that the above copyright notice and this paragraph are
  7.  * duplicated in all such forms and that any documentation,
  8.  * advertising materials, and other materials related to such
  9.  * distribution and use acknowledge that the software was developed
  10.  * by the University of California, Lawrence Berkeley Laboratory,
  11.  * Berkeley, CA.  The name of the University may not be used to
  12.  * endorse or promote products derived from this software without
  13.  * specific prior written permission.
  14.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  15.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  16.  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  17.  */
  18. static const char rcsid[] =
  19.     "@(#) $Header: /cvsroot/nsnam/ns-2/emulate/inet.c,v 1.5 2000/02/08 23:35:13 salehi Exp $ (LBL)";
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <ctype.h>
  23. #ifdef WIN32
  24. #include <windows.h>
  25. #include <winsock.h>
  26. #else
  27. #include <sys/param.h>
  28. #include <netdb.h>
  29. #include <sys/socket.h>
  30. #include <unistd.h>
  31. #endif
  32. #include "config.h"
  33. #include "inet.h"
  34. u_int32_t
  35. LookupHostAddr(const char *s)
  36. {
  37. if (isdigit(*s))
  38. return (u_int32_t)inet_addr(s);
  39. else {
  40. struct hostent *hp = gethostbyname(s);
  41. if (hp == 0)
  42. /*XXX*/
  43. return (0);
  44. return *((u_int32_t **)hp->h_addr_list)[0];
  45. }
  46. }
  47. u_int32_t
  48. LookupLocalAddr(void)
  49. {
  50. static u_int32_t local_addr;
  51. char name[MAXHOSTNAMELEN];
  52. if (local_addr == 0) {
  53. (void)gethostname(name, sizeof(name));
  54. local_addr = LookupHostAddr(name);
  55. }
  56. return (local_addr);
  57. }
  58. /*
  59.  * A faster replacement for inet_ntoa().
  60.  * Extracted from tcpdump 2.1.
  61.  */
  62. const char *
  63. intoa(u_int32_t addr)
  64. {
  65. register char *cp;
  66. register u_int byte;
  67. register int n;
  68. static char buf[sizeof(".xxx.xxx.xxx.xxx")];
  69. NTOHL(addr);
  70. cp = &buf[sizeof buf];
  71. *--cp = '';
  72. n = 4;
  73. do {
  74. byte = addr & 0xff;
  75. *--cp = byte % 10 + '0';
  76. byte /= 10;
  77. if (byte > 0) {
  78. *--cp = byte % 10 + '0';
  79. byte /= 10;
  80. if (byte > 0)
  81. *--cp = byte + '0';
  82. }
  83. *--cp = '.';
  84. addr >>= 8;
  85. } while (--n > 0);
  86. return cp + 1;
  87. }
  88. char *
  89. InetNtoa(u_int32_t addr)
  90. {
  91. const char *s = intoa(addr);
  92. char *p = (char *)malloc(strlen(s) + 1);
  93. strcpy(p, s);
  94. return p;
  95. }
  96. char *
  97. LookupHostName(u_int32_t addr)
  98. {
  99. char *p;
  100. struct hostent* hp;
  101. /*XXX*/
  102. if (IN_MULTICAST(ntohl(addr)))
  103. return (InetNtoa(addr));
  104. hp = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET);
  105. if (hp == 0) 
  106. return InetNtoa(addr);
  107. p = (char *)malloc(strlen(hp->h_name) + 1);
  108. strcpy(p, hp->h_name);
  109. return p;
  110. }
  111. /*  
  112.  * in_cksum --
  113.  *      Checksum routine for Internet Protocol family headers (C Version)
  114.  * [taken from ping.c]
  115.  */ 
  116. u_short  
  117. in_cksum(addr, len)
  118.         u_short *addr; 
  119.         int len;
  120. {   
  121.         register int nleft = len;       
  122.         register u_short *w = addr;
  123.         register int sum = 0;
  124.         u_short answer = 0;
  125.     
  126.         /*                      
  127.          * Our algorithm is simple, using a 32 bit accumulator (sum), we add
  128.          * sequential 16 bit words to it, and at the end, fold back all the
  129.          * carry bits from the top 16 bits into the lower 16 bits.
  130.          */      
  131.         while (nleft > 1)  {
  132.                 sum += *w++;
  133.                 nleft -= 2;
  134.         }       
  135.     
  136.         /* mop up an odd byte, if necessary */
  137.         if (nleft == 1) {
  138.                 *(u_char *)(&answer) = *(u_char *)w ;
  139.                 sum += answer;
  140.         }
  141.         /* add back carry outs from top 16 bits to low 16 bits */
  142.         sum = (sum >> 16) + (sum & 0xffff);     /* add hi 16 to low 16 */
  143.         sum += (sum >> 16);                     /* add carry */
  144.         answer = ~sum;                          /* truncate to 16 bits */
  145.         return(answer);
  146. }
  147. #include <netinet/in_systm.h>
  148. #include <netinet/ip.h>
  149. #include <stdio.h>
  150. void
  151. print_ip(struct ip *ip)
  152. {
  153. char buf[64];
  154. u_short off = ntohs(ip->ip_off);
  155. printf("IP v:%d, ihl:%d, tos:%d, id:%d, off:%d [df:%d, mf:%d], sum:%d, prot:%dn",
  156. ip->ip_v, ip->ip_hl, ip->ip_tos, ntohs(ip->ip_id),
  157. off & IP_OFFMASK,
  158. (off & IP_DF) ? 1 : 0,
  159. (off & IP_MF) ? 1 : 0,
  160. ip->ip_sum, ip->ip_p);
  161. #ifdef HAVE_ADDR2ASCII
  162. addr2ascii(AF_INET, &ip->ip_src, 4, buf);
  163. #else
  164. inet_ntoa(ip->ip_src);
  165. #endif /* HAVE_ADDR2ASCII */
  166. #ifdef HAVE_ADDR2ASCII
  167. printf("IP len:%d ttl: %d, src: %s, dst: %sn",
  168. ntohs(ip->ip_len), ip->ip_ttl, buf,
  169. addr2ascii(AF_INET, &ip->ip_dst, 4, 0));
  170. #else
  171. printf("IP len:%d ttl: %d, src: %s, dst: %sn",
  172. ntohs(ip->ip_len), ip->ip_ttl, buf,
  173.        inet_ntoa(ip->ip_src));
  174. #endif /* HAVE_ADDR2ASCII */
  175. }