Á¶°¢ ÄÚµå : icmp ÀÀ´ä½Ã°£ üũ
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : Code>C>icmp_check



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

¼³¸í

¸ñÀû ¼­¹ö¿¡ ´ëÇÑ ICMP¿¡ ´ëÇÑ ÀÀ´ä½Ã°£À» üũÇÑ´Ù.

»ç¿ë¹æ¹ý

001  int main(int argc, char **argv)
002  {
003      int sockfd;
004      int ip;
005      struct timeval atime;
006      struct sockaddr_in addr; 
007      sockfd = IcmpInit();
008      ip = CheckIcmp(sockfd, argv[1], &atime, &addr);
009      printf("%s ---> %d sec %d msec\n", inet_ntoa(addr.sin_addr), 
010                  atime.tv_sec, atime.tv_usec);
011      IcmpClear(sockfd);    
012  }
013  

À§ÀÇ Äڵ带 ÄÄÆÄÀÏÇÑ ÈÄ ½ÇÇà½ÃŲ °á°ú´Ù.
# ./icmp_check www.joinc.co.kr 
218.234.19.87 ---> 0 sec 8 msec 
 

int IcmpInit(); 
 
  1. ICMP ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÏ´Â RAW ¼ÒÄÏÀ» ÀÛ¼ºÇÑ´Ù.
  2. return : ¿­¸° ¼ÒÄÏÁöÁ¤ÀÚ¸¦ ¸®ÅÏÇÑ´Ù.


int CheckIcmp(int sockfd,  
            char *dstaddr,  
            struct timeval *atime,  
            struct sockaddr_in *ipaddr) 
 
  1. ¸ñÀûÁö ÁÖ¼Ò·Î ICMP ECHO¸¦ Àü¼ÛÇÏ°í ¸®ÅÏÀ» °Ë»çÇÑ´Ù.
  2. sockfd : IcmpInit()¸¦ ÅëÇØ¼­ ¸®ÅÏµÈ ¼ÒÄÏÁöÁ¤ÀÚ
  3. dstaddr : Á¶»çÇϰíÀÚ ÇÏ´Â ¸ñÀûÁöÀÇ ÀÎÅÍ³Ý ÁÖ¼Ò
  4. atime : ÀÀ´ä ½Ã°£ Á¶»ç, atime.tv_sec (ÃÊ), atime.tv_usec(¹Ð¸®¼¼ÄÁµå)
  5. ipaddr : Ŭ¶óÀ̾ðÆ®(ECHO REPLAY)È£½ºÆ® ÁÖ¼Ò
  6. return : ½ÇÆÐÇßÀ» °æ¿ì -1À» ¸®ÅÏ

int IcmpClear(); 
 
  1. ¼ÒÄÏÀ» ´Ý°í ÀÚ¿øÀ» ÇØÁ¦ÇÑ´Ù.

ÄÚµå

001  #include <stdlib.h>
002  #include <netdb.h> 
003  #include <string.h>
004  #include <netinet/ip_icmp.h>
005  #include <arpa/inet.h>
006  #include <errno.h>
007  #include <sys/socket.h>
008  #include <stdio.h>
009  #include <unistd.h>
010  #include <time.h>
011  #include <sys/types.h>
012  
013  // IP CheckSum »ý¼º 
014  int in_cksum(u_short *p, int n)
015  {
016      register u_short answer;
017      register long sum = 0;
018      u_short odd_byte = 0;
019  
020      while(n > 1)
021      {
022          sum += *p++;
023          n -= 2;
024      }
025  
026      if (n == 1)
027      {
028          *(u_char *)(&odd_byte) = *(u_char *)p;
029          sum += odd_byte;    
030      }
031  
032      sum = (sum >> 16) + (sum & 0xffff);
033      sum += (sum >> 16);
034      answer = ~sum;
035  
036      return (answer);
037  }
038  
039  // ICMP ÇÁ·ÎÅäÄÝÀ» Áö¿øÇÏ´Â RAW¼ÒÄÏ »ý¼º
040  int IcmpInit()
041  {
042      int icmp_socket;
043      icmp_socket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
044      return icmp_socket;
045  }
046  
047  int CheckIcmp(int sockfd, 
048              char *dstaddr, 
049              struct timeval *atime, 
050              struct sockaddr_in *ipaddr)
051  {
052      struct icmp *p, *rp;
053      char buffer[1024];
054      int sl, ret, hlen;
055      int diff;
056      struct sockaddr_in addr, sin, from;
057      struct ip *ip;
058      struct timeval ltime;
059      struct hostent *hentry;
060  
061      // È£½ºÆ® À̸§À¸·Î ºÎÅÍ ÁÖ¼Ò°©À» ¾ò¾î¿Â´Ù.
062      if ((hentry = gethostbyname(dstaddr)) == NULL)
063      {
064          return -1;
065      }
066  
067      gettimeofday(<ime, NULL);
068      memset(buffer, 0x00, 1024);
069      p = (struct icmp *)buffer;
070      p->icmp_type = ICMP_ECHO;
071      p->icmp_code = 0;
072      p->icmp_cksum = 0;
073      p->icmp_seq = 15; 
074      p->icmp_id = getpid();
075      p->icmp_dun.id_ts.its_otime = ((ltime.tv_sec%100)*10000)+(ltime.tv_usec / 100); 
076      p->icmp_cksum = in_cksum((u_short *)p, 1000);
077      memcpy(buffer+sizeof(*p), (void *)&time, 4);
078  
079      memset(&addr, 0, sizeof(0));
080      memcpy(&addr.sin_addr, hentry->h_addr, hentry->h_length);
081      addr.sin_family = AF_INET;
082  
083      ret = sendto(sockfd, p, sizeof(*p), MSG_DONTWAIT, 
084                      (struct sockaddr *)&addr, sizeof(addr)); 
085      if (ret < 0)
086      {
087          exit(0);
088          return -1;
089      }
090      sl = sizeof(from);
091      ret = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr *)&from, &sl); 
092  
093      if (ret < 0)
094          return -1;
095      ip = (struct ip *)buffer;
096      hlen = ip->ip_hl*4;
097      rp = (struct icmp *)(buffer+hlen);
098      gettimeofday(<ime, NULL);
099      diff = (((ltime.tv_sec%100)*10000)+ltime.tv_usec/100) - rp->icmp_dun.id_ts.its_otime;
100      atime->tv_sec = diff/1000; 
101      atime->tv_usec = diff/10; 
102      *ipaddr = addr;
103      return sin.sin_addr.s_addr;
104  }
105  
106  int IcmpClear(int sockfd)
107  {
108      close(sockfd);
109      return 1;
110  }
111  

ÇØ¾ßµÉ °Í

¼­¹ö°¡ ÀÏÁ¤½Ã°£ ÀÀ´äÇÏÁö ¾ÊÀ»°æ¿ì ¿¡·¯¸¦ ¹ß»ýÇÏ°í ¸®ÅÏÇϵµ·Ï Äڵ带 ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ¼ÒÄÏ ÁöÁ¤ÀÚ¿¡ ´ëÇØ select()¸¦ ÀÌ¿ëÇÏ¸é µÉ°ÍÀÌ´Ù. ÀԷ¿¡ ´ëÇÑ select()°ü·Ã ÄÚµå´Â read_wait¸¦ Âü°íÇϱ⠹ٶõ´Ù.

º¯°æ»çÇ×

2004/02/02

  1. µµ¸ÞÀÎ À̸§¿¡ ´ëÇØ¼­ IPÁÖ¼Ò¸¦ ãÀ» ¼ö ÀÖµµ·Ï È®Àå
  2. ECHO REPLY È£½ºÆ®ÀÇ ÁÖ¼Ò Á¤º¸¸¦ °¡Á®¿Ã ¼ö ÀÖµµ·Ï CheckIcmp¿¡ 4¹øÂ° ÀÎÀÚ Ãß°¡
category_C ÄÚµå
category__200
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.