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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* Attempt to send an ICMP packet, writing the ICMP and IP headers. 
  2.  * (Lacks adding the time to the end of the packet).
  3.  * Thamer Al-Herbish shadows@whitefang.com
  4.  */
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <netinet/in.h>
  10. #include <arpa/inet.h>
  11. #include <netinet/in_systm.h>
  12. #include <netinet/ip.h>
  13. #include <netinet/ip_icmp.h>
  14. #if defined(SOLARIS_CKSUM_BUG)
  15. #include <netinet/tcp.h>
  16. #endif
  17. #include <strings.h>
  18. #include <unistd.h>
  19. #if !defined(HAVE_INCKSUM)
  20. #include <checksum.h>
  21. #endif
  22. #if !defined(IPVERSION)
  23. #define IPVERSION 4  /* Incase some system does not have this definition. */
  24. #endif               /* We'll always be using 4 as the version anyway. */
  25. #if !defined(LINUX)
  26. #define BUFFSIZE (sizeof(struct icmp) + sizeof(struct ip))
  27. #else
  28. #define BUFFSIZE (sizeof(struct icmphdr) + sizeof(struct iphdr))
  29. #endif
  30. int main(int argc,char *argv[])
  31. {
  32. #if !defined (LINUX)
  33.   struct icmp *icmphdr;
  34.   struct ip *iphdr;
  35. #else
  36.   struct icmphdr *icmphdr;
  37.   struct iphdr *iphdr;
  38. #endif
  39.   unsigned char buff[BUFFSIZE];
  40.   int sockd;
  41.   struct sockaddr_in mysocket;
  42.   int on = 1;
  43.  
  44.  if(argc < 3) {
  45.    fprintf(stderr,"usage: %s source-ip dest-ipn",argv[0]);
  46.    exit(-1);
  47.  }
  48.   if((sockd = socket(AF_INET,SOCK_RAW,IPPROTO_RAW)) < 0)  {
  49.     perror("socket");
  50.     exit(-1);
  51.   }
  52.   
  53.   if(setsockopt(sockd,IPPROTO_IP,IP_HDRINCL,(char *)&on,sizeof(on)) < 0)  {
  54.     perror("setsockopt");
  55.     exit(-1);
  56.   }
  57. #if !defined(LINUX)
  58.   iphdr = (struct ip *)buff;
  59.   bzero((char *)iphdr,sizeof(struct ip));
  60.   
  61.   iphdr->ip_hl = 5;
  62.   iphdr->ip_v = IPVERSION;
  63. #ifdef IP_LEN_HORDER
  64.   iphdr->ip_len = (sizeof(struct ip) + sizeof(struct icmp));
  65. #else
  66.   iphdr->ip_len = htons(sizeof(struct ip) + sizeof(struct icmp));
  67. #endif
  68.   iphdr->ip_id = htons(getpid());
  69.   iphdr->ip_ttl = 60;
  70.   iphdr->ip_p = IPPROTO_ICMP;
  71.   iphdr->ip_src.s_addr = inet_addr(argv[1]);
  72.   iphdr->ip_dst.s_addr = inet_addr(argv[2]);
  73.   
  74.   iphdr->ip_sum = (unsigned short)in_cksum((unsigned short *)iphdr,
  75.    sizeof(struct ip));
  76.   
  77.   icmphdr = (struct icmp *)(buff + sizeof(struct ip));
  78.   bzero((char *)icmphdr,sizeof(struct icmp));
  79.   
  80.   icmphdr->icmp_type = ICMP_ECHO;
  81.   icmphdr->icmp_seq = getpid();
  82.   icmphdr->icmp_id = getpid();
  83.   icmphdr->icmp_cksum = in_cksum((unsigned short *)icmphdr,sizeof(struct icmp));
  84. #else
  85.   iphdr = (struct iphdr *)buff;
  86.   bzero((char *)iphdr,sizeof(struct iphdr));
  87.   
  88.   iphdr->ihl = 5;
  89.   iphdr->version = IPVERSION;
  90.     
  91. #ifdef IP_LEN_HORDER
  92.   iphdr->tot_len = (sizeof(struct iphdr) + sizeof(struct icmphdr));
  93. #else
  94.   iphdr->tot_len = htons(sizeof(struct iphdr) + sizeof(struct icmphdr));
  95. #endif
  96.   
  97.   iphdr->id = htons(getpid());
  98.   iphdr->ttl = 60;
  99.   iphdr->protocol = IPPROTO_ICMP;
  100.   iphdr->saddr = inet_addr(argv[1]);
  101.   iphdr->daddr = inet_addr(argv[2]);
  102.   iphdr->check = in_cksum((unsigned short *)iphdr,sizeof(struct iphdr));
  103.   
  104.   icmphdr = (struct icmphdr *)(buff +sizeof(struct iphdr));
  105.   bzero((char *)icmphdr,sizeof(struct icmphdr));
  106.   
  107.   icmphdr->type = ICMP_ECHO;
  108.   icmphdr->un.echo.sequence = getpid();
  109.   icmphdr->un.echo.id =  getpid();
  110.   
  111.   icmphdr->checksum = in_cksum((unsigned short *)icmphdr,
  112. sizeof(struct icmphdr));
  113. #endif /* LINUX */
  114.   
  115.   bzero((char *)&mysocket,sizeof(mysocket));
  116.   
  117.   mysocket.sin_family = AF_INET;
  118.   mysocket.sin_addr.s_addr = inet_addr(argv[2]);
  119.   
  120.   if(sendto(sockd,(char *)buff,sizeof(buff),0x0,
  121.     (struct sockaddr *)&mysocket,sizeof(mysocket)) < 0)  {
  122.     perror("sendto");
  123.     exit(-1);
  124.   }
  125.   
  126.  exit(0);
  127. }