ip_gen.c
上传用户:bobuwen
上传日期:2007-01-07
资源大小:10k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* RAW socket utility routine:
  2.  * 
  3.  * Write out an IP header.
  4.  * shadows@whitefang.com
  5.  * Thamer Al-Herbish
  6.  */
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <sys/types.h>
  10. #include <sys/socket.h>
  11. #include <netinet/in.h>
  12. #include <arpa/inet.h>
  13. #include <netinet/in_systm.h>
  14. #include <netinet/ip.h>
  15. #include <unistd.h>
  16. #include <string.h>
  17. #if !defined(HAVE_INCKSUM)
  18. #include <checksum.h>
  19. #endif
  20. #if !defined(IPVERSION)
  21. #define IPVERSION 4  /* Incase some system does not have this definition. */
  22. #endif               /* We'll always be using 4 as the version anyway. */
  23. #define DEFAULT_TTL 60  /* Just hard code the ttl in the ip header.*/
  24. void ip_gen(char *packet,unsigned char protocol,struct in_addr saddr,
  25.     struct in_addr daddr,unsigned short length)
  26. {
  27. #if !defined(LINUX)
  28.   struct ip *iphdr;
  29. #else
  30.   struct iphdr *iphdr;
  31. #endif /* LINUX */
  32. #if !defined(LINUX)
  33.   iphdr = (struct ip *)packet;
  34.   memset((char *)iphdr,'',sizeof(struct ip));
  35.   
  36.   iphdr->ip_hl = 5;
  37.   iphdr->ip_v = IPVERSION;
  38.   
  39. #ifdef IP_LEN_HORDER
  40.   iphdr->ip_len = length;
  41. #else
  42.   iphdr->ip_len = htons(length);
  43. #endif /* IP_LEN_HORDER */
  44.   iphdr->ip_id = htons(getpid());
  45.   iphdr->ip_ttl = DEFAULT_TTL;
  46.   iphdr->ip_p = protocol;
  47.   iphdr->ip_src = saddr;
  48.   iphdr->ip_dst = daddr;
  49.   
  50.   iphdr->ip_sum = (unsigned short)in_cksum((unsigned short *)iphdr,
  51.    sizeof(struct ip));
  52.   
  53. #else /* LINUX */
  54.   
  55.   iphdr = (struct iphdr *)packet;
  56.   memset((char *)iphdr,'',sizeof(struct iphdr));
  57.   
  58.   iphdr->ihl = 5;
  59.   iphdr->version = IPVERSION;
  60.     
  61. #ifdef IP_LEN_HORDER
  62.   iphdr->tot_len = length;
  63. #else
  64.   iphdr->tot_len = htons(length);
  65. #endif /* IP_LEN_HORDER */
  66.   
  67.   iphdr->id = htons(getpid());
  68.   iphdr->ttl = DEFAULT_TTL;
  69.   iphdr->protocol = protocol;
  70.   iphdr->saddr = saddr.s_addr;
  71.   iphdr->daddr = daddr.s_addr;
  72.   iphdr->check = (unsigned short)in_cksum((unsigned short *)iphdr,
  73.   sizeof(struct iphdr));
  74. #endif /* LINUX */
  75.   return;
  76. }