ping.py ºÐ¼®

°¥°¡¸¶±¸ ´Ô²²¼­ ¾²½Å ±ÛÀÔ´Ï´Ù.
(¿Ã¸° ³¯ : 2003-01-07)

Á¦°¡ ¸¸µç°Ç ¾Æ´Ï±¸¿ä
ÀÎÅͳݿ¡ ÀÖ´ø°Çµ¥ Çѹø ºÐ¼®(?)ÇØ ºÃ°Åµç¿ä...

±Ùµ¥ À̰аøºÎ¸¹ÀÌ µÇµ¥¿ä..
±×³É Âü°í Çϼ¼¿ä..
       1    #!/usr/bin/env python
       2    
       3    # Derived from ping.c distributed in Linux's netkit. That code is
       4    # copyright (c) 1989 by The Regents of the University of California.
       5    # That code is in turn derived from code written by Mike Muuss of the
       6    # US Army Ballistic Research Laboratory in December, 1983 and
       7    # placed in the public domain. They have my thanks.
       8    
       9    # Bugs are naturally mine. I'd be glad to hear about them. There are
      10    # certainly word-size dependenceies here.
      11    
      12    # Copyright (c) Matthew Dixon Cowles, <http://www.visi.com/~mdc/>.
      13    # Distributable under the terms of the GNU General Public License
      14    # version 2. Provided with no warranties of any sort.
      15    
      16    # Note that ICMP messages can only be sent from processes running
      17    # as root.
      18    
      19    # Revision history:
      20    #
      21    # November 22, 1997
      22    # Initial hack. Doesn't do much, but rather than try to guess
      23    # what features I (or others) will want in the future, I've only
      24    # put in what I need now.
      25    #
      26    # December 16, 1997
      27    # For some reason, the checksum bytes are in the wrong order when
      28    # this is run under Solaris 2.X for SPARC but it works right under
      29    # Linux x86. Since I don't know just what's wrong, I'll swap the
      30    # bytes always and then do an htons().
      31    #
      32    # December 4, 2000
      33    # Changed the struct.pack() calls to pack the checksum and ID as
      34    # unsigned. My thanks to Jerome Poincheval for the fix.
      35    #
      36    
      37    import os
      38    from socket import *
      39    import struct
      40    import select
      41    import time
      42    import sys
      43    
      44    # From /usr/include/linux/icmp.h; your milage may vary.
      45    ICMP_ECHO_REQUEST=8 # Seems to be the same on Solaris.
      46    
      47    # I'm not too confident that this is right but testing seems
      48    # to suggest that it gives the same answers as in_cksum in ping.c
      49    def checksum(str):
      50      sum=0
      51      countTo=(len(str)/2)*2
      52      count=0
      53      while count<countTo:
      54        thisVal=ord(str[count+1])*256+ord(str[count])
      55        sum=sum+thisVal
      56        sum=sum & 0xffffffff # Necessary?
      57        count=count+2
      58    
      59      if countTo<len(str):
      60        sum=sum+ord(str[len(str)-1])
      61        sum=sum & 0xffffffff # Necessary?
      62    
      63      sum=(sum >> 16) + (sum & 0xffff)
      64      sum=sum+(sum >> 16)
      65      answer=~sum
      66      answer=answer & 0xffff
      67    
      68      # Swap bytes. Bugger me if I know why.
      69      answer=answer >> 8 | (answer << 8 & 0xff00)
      70      
      71      return answer
      72    
      73    def receiveOnePing(mySocket,ID,timeout):
      74      timeLeft=timeout
      75      while 1:
      76        startedSelect=time.time()
      77        whatReady=select.select([mySocket],[],[],timeLeft)
      78        howLongInSelect=(time.time()-startedSelect)
      79        if whatReady[0]==[]: # Timeout
      80          return None
      81        timeReceived=time.time()
      82        recPacket,addr=mySocket.recvfrom(1024)
      83        icmpHeader=recPacket[20:28]
      84        type,code,checksum,packetID,sequence=struct.unpack("bbHHh",icmpHeader)
      85        if packetID==ID:
      86          bytesInDouble=struct.calcsize("d")
      87          timeSent=struct.unpack("d",recPacket[28:28+bytesInDouble])[0]
      88          return timeReceived-timeSent
      89          
      90        timeLeft=timeLeft-howLongInSelect
      91        if timeLeft<=0:
      92          return None
      93    
      94    def sendOnePing(mySocket,destAddr,ID):
      95      # Header is type (8), code (8), checksum (16), id (16), sequence (16)
      96      myChecksum=0
      97      # Make a dummy heder with a 0 checksum.
      98      header=struct.pack("bbHHh",ICMP_ECHO_REQUEST,0,myChecksum,ID,1)
      99      bytesInDouble=struct.calcsize("d")
     100      data=(192-bytesInDouble) * "Q"
     101      data=struct.pack("d",time.time())+data
     102      # Calculate the checksum on the data and the dummy header.
     103      myChecksum=checksum(header+data)
     104      # Now that we have the right checksum, we put that in. It's just easier
     105      # to make up a new header than to stuff it into the dummy.
     106      header=struct.pack("bbHHh",ICMP_ECHO_REQUEST,0,htons(myChecksum),ID,1)
     107      packet=header+data
     108      mySocket.sendto(packet,(destAddr,1)) # Don't know about the 1 
     109      return None
     110      
     111    def doOne(destAddr,timeout=10):
     112      # Returns either the delay (in seconds) or none on timeout.
     113      icmp=getprotobyname("icmp")
     114      mySocket=socket(AF_INET,SOCK_RAW,icmp)
     115      myID=os.getpid() & 0xFFFF
     116      sendOnePing(mySocket,destAddr,myID)
     117      delay=receiveOnePing(mySocket,myID,timeout)
     118      mySocket.close()
     119      return delay
     120    
     121    def main():
     122      if len(sys.argv)<2:
     123        print "Usage: %s hostname" % os.path.basename(sys.argv[0])
     124        sys.exit(1)
     125    
     126      dest=gethostbyname(sys.argv[1])
     127      delay=doOne(dest)
     128      print delay
     129      return None
     130    
     131    if __name__=='__main__':
     132      main()
     133      sys.exit(0)
¹«¾óÇÒ±î?
...
ÀÌ´ë¸ñ¿¡¼­ ÇÑÂüÀ» °í¹ÎÇÏ´Ù pingÇÁ·Î±×·¥À» ºÐ¼®Çغ¸±â·Î Çß´Ù..
ÇöÀçÀÇ ½Ç·ÂÀ¸·Ð ¾î¸²¾øÀ»°Í °°Áö¸¸. Çѹø ÇØº¸ÀÚ. ¾ÊµÇ¸é ¸»°í.

¸ÕÀú ¼Ò½º´Â ftp://ftp.visi.com/users/mdc/ping.py¼­ °¡Á®¿Ô´Ù.
´Ù¸¥°Ç ¾ø°í ¿ÀÁ÷ ping.pyÆÄÀÏ Çϳª·Î ÀÌ·ç¾îÁ® ÀÖ¾î ºÐ¼®ÇϱⰡ ½¬¿ï°Í °°´Ù.
ÆÄÀ̽ã v2.1¿¡¼­ ÀÛ¼ºµÇ¾ú´Ù°í ¾º¿©ÀÖ´Ù.

°£´ÜÇÏ°Ô ping.pyÀÇ »ç¿ë¹ýÀ̳ª ¾Ë¾Æº¸°í¼­ ³ª¼­ ½ÃÀÛÇÏÀÚ

  »ç¿ë¹ý: python ping.py ÁÖ¼Ò(µµ¸ÞÀÎ ¶Ç´Â IPÁÖ¼Ò)

»ç¿ë¹ýÀº ¸Å¿ì °£´ÜÇß´Ù. ¹«½¼ ¿É¼Ç °°Àº °Íµµ ¾ø°í, °á°úµµ »ç¿ë¹ý ¸¸Å­À̳ª
°£´ÜÇß´Ù. ±×³É ¼ýÀÚ¸¸ ´ú··, ±×°Íµµ Çϳª¸¸.. Âü³»! ³ªÁß¿¡ ¹Ù²ã¾ßÁö

´Ù ¾îµð´Ù ¾µ°ÇÁö 6°³³ª ¸ðµâÀ» ¼öÀÔÇÑ´Ù(37Çà-42Çà). ÇÊ¿äÇϴϱî ÇϰÚÁö¸¸
ÇÏ¿©Æ° µÎ°íº¸¸é ¾Ë ¼öÀÖÁö ¾ÊÀ»±î?

    »ç¿ëµÈ ¸ðµâ
        os
        socket
        select
        time
        sys

    Àü¿ªº¯¼ö ( ÀÌ°Ô ¸Â³ª?  ¾î·µç ¿©·¯ ÇÔ¼ö¿¡¼­ »ç¿ëµÇ³×..45Çà)
        ICMP_ECHO_REQUEST=8

        pingÀº icmpÀÇ Echo Request¸¦ ÀÌ¿ëÇØ ÀÎÅÍ³Ý Á¢¼ÓÀ» Å×½ºÆ® ÇÑ´Ù.
        ±×·³ Echo Request´Â ¾î¶»°Ô ÀÌ¿ëÇϳª?
        icmp Çì´õ¸¦ º¸¸é typeÀ̶ó´Â Çʵ尡 Àִµ¥ ¿©±â¿¡ 8À» ½á³ÖÀ¸¸é µÈ´Ù.
        ÀÌ°Ô ´Ù³Ä? ±×°Ô ´Ù´Ù ÀÌ·¸°Ô ÇÏÀÚ°í ´Ùµé ¾à¼Ó Çß´Ü´Ù...
        (±Ùµ¥ ¼ýÀÚ´Â Çê°¥¸®´Ï±î? ¾Ë¾Æº¸±â ½±°Ô ÇÏ·Á°í ÇÑÁþÀÌ ¾Æ´Ò±î? 98Çà)

        ICMP ¸Þ½ÃÁö Á¾·ù´Â ¾Æ·¡¸¦ ÂüÁ¶ ¹Ù¶÷
        http://www.ginet.co.kr/ginetwork/n_study/htmlup2/net-tcp5.htm#%20Time%20Exceeded%20Message

    »ç¿ëµÈ ÇÔ¼ö

        main()
         |
         +-- doOne(destAddr,timeout=10)
              |
              +-- sendOnePing(mySocket,destAddr,ID)
              +-- receiveOnePing(mySocket,ID,timeout)
                   |
                   +-- checksum(str):

        »ç¿ëµÈ ÇÔ¼ö´Â ÃÑ 5°³
        À§ÀÇ ±×¸²Ã³·³ mainÀÌ doOneÀ» doOneÀÌ sendOnePing, receiveOnePingÀ»
        ÀÌ·± ½ÄÀ¸·Î È£ÃâÇÑ´Ù. À½ ¹ú½á ºÐ¼®ÀÌ ³¡³µ±º...

        ÀÌÁ¦ ÇÔ¼ö ÇϳªÇϳª¸¦ ÇØºÎ ÇØº¸±â·Î ÇÏÀÚ ¿©±â±îÁö´Â º°´Ù¸¥ ¾î·Á¿òÀÌ
        ¾ø¾ú´Âµ¥ ÀÌÁ¦ ºÎÅÏ ±×·¸Áö ¾ÊÀ»°Í °°´Ù.. ¹¹ ±×·¡µµ ³¡±îÁö ÇØº¼¶õ´Ù..
        ¾Æ´Ï¸é ¸»°í.


¸ÕÀú ¾îµð¸¦ º¼±î? ¾Æ¹«·¡µµ Á¦ÀϸÕÀú ½ÃÀ۵Ǵ °÷ºÎÅÍ Â÷·Ê´ë·Î º¸´Â°Ô.. À½


131Çà-133Çà  __name__ÀÌ '__main__'ÀÏ °æ¿ì ÇÔ¼ö main()À» È£Ãâ ÀÌ°Ô ¹º¼Ò¸±±î?
             ¸í·ÉÇà(À¯´Ð½ºÀÇ ½ºÅ©¸³Æ®ÆÄÀÏ)¿¡¼­ ½ÇÇàÇϸé __name__Àº '__main__'
             °ªÀ» °¡Áö°Ô µÈ´Ù.

121Çà-129Çà main()
             |
             +- Àμö : ¾øÀ½
             |
             +- °á°ú°ª : ¾øÀ½

            Âü ¾î·Æ°Ô ½á³ù´Ù. ±×³É ÇÎÇÒ ÁÖ¼Ò°¡ ¾ø´Â°æ¿ì(sys.argv < 2)
            »ç¿ë¹ý Ãâ·ÂÇϰí Á¾·á ÀÌ°Ô ÀüºÎÀε¥...

            126ÇàÀº ÁÖ¾îÁø ÁÖ¼Ò(µµ¸ÞÀÎÁÖ¼Ò)¸¦ IPÁÖ¼Ò·Î º¯È¯ÇÑ´Ù.
            'www.yahoo.com' -> '66.218.71.88'
            IPÁÖ¼ÒÀÎ °æ¿ì´Â ±×´ë·Î »ç¿ëµÈ´Ù. µû¶ó¼­ µµ¸ÞÀÎÁÖ¼Ò ¶Ç´Â IPÁÖ¼Ò
            ¸ðµÎ »ç¿ë°¡´É À½ Çϳª ¹è¿ü´Ù..
            Âü°í·Î gethostbynameÀº socket¸ðµâ ¼Ò¼ÓÀÔ´Ï´Ù.

            doOne()À» ½ÇÇàÇÑ´Ù

111Çà-119Çà doOne(destAddr, timeout=10)
             |
             +- Àμö : destAddr [¸ñÀûÁö ÁÖ¼Ò], timeout  [ÀÀ´ä´ë±â ½Ã°£]
             |
             +- °á°ú°ª : ¼Óµµ

            ªÁö¸¸ ÇÒ ÀÏÀÌ ¸¹Àº°Í °°Àº ºÒ±æÇÑ ¿¹°¨ÀÌ.....
            icmpÇÁ·ÎÅäÄÝÀ» Á÷Á¢ »ç¿ëÇϱâ À§ÇØ »ý¼ÒÄÏ(raw socket)À» ¸¸µé°í
            sendOnePing(),reveiveOnePing()ÇÔ¼ö¸¦ È£ÃâÇÑ ´ÙÀ½ °á°ú°ªÀ» Ãâ·ÂÇÑ´Ù.
            ¹°·Ð icmpÆÐŶÀ» ¸¸µé±â À§ÇÑ ¸î¸î Áغñ¸¦ ÇÑ ´ÙÀ½¿¡..

            ¹» ÁغñÇϳª... ±×·¸´Ù ÁغñÇϱä Çϴµ¥ ¹»±î? ÀÌ°É ÀÌÇØÇÏ·Á¸é
            icmp¸Þ½ÃÁö Çì´õ¸¦ ÀÌÇØÇØ¾ß ÇϹǷΠ°£´ÜÇϰԳª¸¶ »ìÆìº¸ÀÚ.


             0                   1                   2                   3
             0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
             +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
             |     Type      |     Code      |          Checksum           |
             +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
             |           Identifier          |        Sequence Number      |
             +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
             |     Data ...
             +-+-+-+-+-


             [ ICMP ÀÀ´äÀ» À§Çؼ­ Àü¼ÛÇØ¾ßÇÒ ICMP Çì´õ Á¤º¸ ]
             ping ÇÁ·Î±×·¥À» ¸¸µé·Á¸é tcp, udp¿Í´Â ´Þ¸® Àü¼ÛÇÒ ÆÐŶÀ» ±ÍÂú¾Æµµ
             Á÷Á¢ ¸¸µé¾î Áà¾ßÇÑ´Ü´Ù.. Á¤¸» ±ÍÂú´Ù.  ÆÐŶ¸¸µå´Â ¹ýÀº ³ªÁß¿¡
             µû·Î ¾Ë¾Æº¸ÀÚ Áö±ÝÇÏ¸é ³Ê¹« ±æ¾î Áö´Ï±î...

             doOne¿¡¼­´Â IdentifierÇϳª¸¸ ÇÊ¿äÇÏÁö¸¸ ³ªÁß¿¡ ¾îÂ¥ÇÇ ¾Ë¾Æ¾ß ÇÏ
             ´Ï±î ÀÌÂü¿¡ ÇϳªÇϳª ¹¹ÇÏ´Â ³ðÀÎÁö ¾Ë¾Æº¸ÀÚ.

                * Type(8 bit): pingÀ» ¸¸µé(?)²¨´Ï±î 8¹øÀ» »ç¿ëÇÑ´Ù
                              45Çà¿¡¼­ ¹Ì¸®Á¤ÀÇ(ICMP_ECHO_REQUEST=8)

                   0 icmp echo replay icmp ¿äû¿¡ ´ëÇÑ icmp ÀÀ´ä
                   3 Destination Unreachable Message ¼ö½ÅÁö±îÁö ¸Þ½ÃÁö°¡ µµÂøÇÒ¼ö ¾øÀ½
                   4 Source Quench Message ¼Û½ÅÁö ¾ïÁ¦
                   5 Redirect Message ÀçÁö½Ã
                   8 icmp echo request ¸ñÀûÁö È£½ºÆ®¿¡ ICMP ÀÀ´äÀ» ¿äûÇÑ´Ù
                  11 Time Exceeded Message µ¥ÀÌŸ±×·¥ ½Ã°£Ãʰú(TTL Ãʰú)
                  12 Parameter Problem Message µ¥ÀÌŸ±×·¥¿¡¼­ÀÇ ÆÄ¶ó¸ÞŸ ¹®Á¦
                  13 Timestamp ½Ã°£±â·Ï¿äû
                  14 Timestamp Reply Message ½Ã°£±â·ÏÀÀ´ä


                * Code(8 bit): °¢ Type Á¾·ù¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¿À·ùÀÇ À¯ÇüÀ» ¾Ë·ÁÁÖ±â
                               À§Çؼ­ »ç¿ëµÈ´Ù.
                               µû¶ó¼­ icmp echo request¿¡¼­´Â 0 À̵ȴÙ(98Çà)

                * Checksum(16 bit): Ȥ½Ã Àü¼Û Áß¿¡ ¿¡·¯°¡ ¹ß»ý‰ç´ÂÁö, Á¦´ë·Î Àü´Þ
                                    ÀÌ µÆ´ÂÁö °Ë»çÇϱâ À§Çؼ­ ÇÊ¿äÇÏ´Ù..

                                    ÇÔ¼ö checksum()ÀÌ ÀÌ ¿ªÇÒÀ» ÇÑ´Ù.. ¸î¸î ÇÁ·Î±×
                                    ·¥¿¡¼­ °øÅëÀûÀ¸·Î »ç¿ëµÇ´Â°Í °°´Ù.. ´çºÐ°£Àº
                                    ±×³É º¹»çÇØ¼­ ¾²°í ½Ã°£ ³ª¸é ÂùÂùÈ÷ Çѹø¾Ë¾Æ
                                    º¸±â·Î ÇÏ°í ¿©±â¼­´Â ±×³É ³Ñ¾î °¡¾ßÁö..

                * Identifier(16 bit): icmp¸Þ½ÃÁö¸¦ º¸³»°í ÀÀ´äÀÌ ¿ÔÀ»¶§ À̳ðÀÌ Á¤
                                      ¸» ³»°¡ º¸³½ ¿äû¿¡ÀÇÇÑ °ÍÀÎÁö ¾Æ´ÑÁö¸¦ ±¸ºÐ
                                      Çϱâ À§Çؼ­ ÇÊ¿äÇÏ´Ù.

                                      ¾î¶»°Ô ±¸ºÐÇϳİí¿ä ?
                                      ±×°Å¾ß identifier°ªÀ» ºñ±³Çغ¸¸é µÇÁö¿ä.

                    Âü°í)identifier°ªÀº º¸Åë icmp¸Þ½ÃÁö¸¦ ¿äûÇÏ´Â ÇÁ·Î±×·¥ÀÇ
                         ÇÁ·Î¼¼½º id°ªÀ» ÀÌ¿ëÇÑ´Ù.(115Çà)

                    ÂüÂü°í) 115ÇàÀ»º¸¸é os.getpid()°ªÀ» ¹Ù·Î¾²Áö ¾Ê°í 0xFFFF°ª°ú
                            ºñÆ® ¿£µå¸¦ Çߴµ¥ ¿Ö ±×·²±î?
                            ³­ ÀÌ°Ô ±Ã±ÝÇß´Ù..  ³ª¸¸ ±×·±°¡.
                            ¾Æ¹«Æ° os.getpid°ªÀ» 16bit·Î ¸¸µé±â À§Çؼ­ ¶ó°í ÁüÀÛ
                            µÈ´Ù.. ¾Æ´Ï¸é ¸»°í.

                * Sequence number(16 bit): À̳ðÀ» ÀÌ¿ëÇØ ³»°¡ º¸³½ ¸î¹øÂ° ÆÐŶÀÎÁö
                                           ±¸ºÐÀÌ °¡´ÉÇÏ´Ù. ¸ÕÀú identifier°¡ °°Àº
                                           Áö ºÎÅÍ È®ÀÎÇØ¾ß ÇÏÁö¸¸.

                * Data : Ãß°¡ÀÇ ÀÚ·á°¡ ÇÊ¿äÇÑ °æ¿ì ¿©±â¿¡´Ù ±â·ÏÇÑµÚ º¸³½´Ù..


 94-107Çà sendOnePing(mySocket,destAddr,ID)
           |
           +- Àμö: mySocket ¹Ì¸® ¸¸µé¾îÁø »ý¼ÒÄÏ, destAddr ¸ñÀûÁö ÁÖ¼Ò, ID Identifier
           |
           +- °á°ú°ª : ¾øÀ½(None)

           icmp Çì´õ¸¦ ¸¸µç´Ù. ¾î¶»°Ô ¸¸µå³ª? °³ÀÎÀûÀ¸·Î ÆÄÀ̽ãÀº icmpÆÐŶÀ»
           ¾î¶»°Ô ¸¸µéÁö ±Ã±ÝÇߴµ¥... À½ struct¸ðµâÀÇ pack()ÇÔ¼ö¸¦ ÀÌ¿ëÇϳ׿ä

           packÀÌ »ç¿ëµÇ´Â °÷Àº ¸ðµÎ ¼¼±ºµ¥(98,101,106Çà)
           ¾ÆÁÖ °£´ÜÈ÷ packÀÇ »ç¿ë¹ýÀ» »ìÆìº¸ÀÚ. ÀÌ·±¸» Á¤¸» ½È¾î ÇÏÁö¸¸
           ÀÚ¼¼ÇÑ ³»¿ëÀº ·¹ÆÛ·±½º °¡À̵带 ÂüÁ¶Çϱ⠹ٶ÷, ³»¿ëÀÌ ±æ¾îÁö´Â°Ç
           ´õ ½È¾î¼­...

           pack(fmt, v1, v2, ...) fmt´Â Æ÷¸Ë, v1,v2´Â Æ÷¸Ë¿¡ ¸ÅÄ¡µÇ´Â °ª
           Æ÷¸ËÀº ±âÈ£(?) ÇÏ¿©Æ° Çѹ®ÀÚ·ÎµÈ °ªµéÀÇ ÁýÇÕÀ̸ç, ¹®ÀÚÇϳª¿¡ ÇϳªÀÇ
           °ªÀÌ ÀÏÄ¡µÇ¾î¾ß ÇÑ´Ù.

           Æ÷¸Ë¿¡ »ç¿ëµÇ´Â ¹®ÀÚ´Â ´ÙÀ½°ú °°´Ù(¿©±â¼­ »ç¿ëµÇ´Â °Í¸¸ ¾Ë¾Æº¸ÀÚ.)

                Format    c type      Python   calcsize
               -----------------------------------------
                 b     signed char    integer     1
                 H     unsigned short integer     2
                 h     short          integer     2
                 d     double         float       8

           À̰͸¸ ºÁ¼­´Â ¹«½¼ ¼Ò¸°Áö ¼ÖÁ÷È÷ ¾Ë¼ö°¡ ¾ø´Ù.
           ´Ù¸¸ calcsize('bbHHh') --> 8 ÀÌ·¸°Ô Çϸé 8byte °ªÀÌ ³ª¿À´Â °ÍÀ¸·Î
           ºÁ¼­ b(1byte), H ¿Í h(2byte)°ªÀ롂 °°´Ù.  c typeÀÇ »çÀÌÁ Âü°íÇϴ°Ô
           Á¤½Å °Ç°­¿¡ ÁÁÀ»µí ÆÄÀ̽ã ŸÀÔÀº ¸ù¶¥ Á¤¼öÇüÀÌ´Ï..

           ´©±¸ ÀÚ¼¼È÷ ¾Æ½Ã´Â ºÐ ÀÖÀ¸½Ã¸é Á» ¾Ë·Á ÁÖ¼¼¿ä...
           ÀÏ´Ü ±×·¸´Ù°í Ä¡°í packÀº ¿©±â¼­ ±×¸¸ÇÏÀÚ.. Âü unpackÀº ¹Ý´ë·Î ÀÌÇØ
           ÇÏ¸é µÇ°í calcsize(fmt)´Â Æ÷¸ËÀÇ »çÀÌÁ ¾Ë·Á ÁÝ´Ï´Ù..

           ¿©±â¼­ ¸¸µé¾î Áö´Â stringÀº 200¹ÙÀÌÆ® ÀÌ´Ù

             icmp Çì´õ(8byte) + ½Ã°£(8byte) + 'Q' 184°³(184byte)

           ¾î¶»°Ô ¸¸µé¾ú´ÂÁö Çѹø º¸ÀÚ.
           84Çà¿¡¼­ Çì´õ¸¦ ¸¸µé°í. -> ÁÖ) ¾ÆÁ÷±îÁö´Â üũ¼¶ÀÇ °ªÀÌ 0ÀÌ´Ù.
                                          üũ¼¶Àº Çì´õ+µ¥ÀÌÅ͸¦ °¡Áö°í ¸¸µé¾î¾ß µÇ´Ï±î

           99-101ÇàÀº ½Ã°£¿¡´Ù º°¾µ¸ð ¾øÀ»°Í °°Àº ¹®ÀÚ'Q'¸¦ 184°³³ª µ¡ºÙÀ̰í

           103-106Çà üũ¼¶À» °è»êÇϰí(103Çà) ÀÌÁ¦¼­¾ß Á¦´ë·ÎµÈ Çì´õ¸¦ ¸¸µç´Ù.

           107Çà µåµð¾î ÆÐŶÀ» ¿Ï¼ºÇß´Ù... Âü³» 94Çà¿¡¼­ 107Çà±îÁö ÀÌÇØ Çϴµ¥
           Àڱ׸¶Ä¡ 3ÀÏ °É·È´Ù.. ¸Ó¸®°¡ ³ª»Û°ÇÁö...

           Ȥ½Ã 106Çà¿¡¼­ ¿Ö htons(myChecksum) ÀÌ·±ÁþÀ» Çß´ÂÁö ±Ã±Ý ÇÏÁö ¾ÊÀº°¡¿ä
           Àú¸¸ ±×·±°¡.. ±Ùµ¥ ÀÌ°Ô Áß¿äÇÑ°Í °°Àº ºÒ±æÇÑ ¿¹°¨(?)ÀÌ...
           ÀÌ°É ÀÌÇØÇÏ·Á¸é

           È£½ºÆ® ¹ÙÀÌÆ® ¿À´õ¿Í ³×Æ®¿÷ ¹ÙÀÌÆ® ¿À´õ °¡ ¹ºÁö¸¦ ¾Ë¾Æ¾ß Çϴµ¥...
           ¹¹ ¾Ë¾Æº¸Áö..


               È£½ºÆ® ¹ÙÀÌÆ® ¼ø¼­[¿À´õ]
                     : ¸®Æ² ¿£µð¾ð(little endian)
                       ÄÄÇ»ÅÍ ³»ºÎ ¸Þ¸ð¸®¿¡ ÀڷḦ ÀúÀåÇÏ´Â ¼ø¼­¸¦ ¸»Çϴµ¥, ÀÌ´Â
                       CPUÀÇ Á¾·ù¿¡ µû¶ó ´Ù¸£¸ç 2¹ÙÀÌÆ®ÀÇ ¼ö 0xC3E2ÀÇ °æ¿ì E2,C3
                       ¼øÀ¸·Î ¸Þ¸ð¸®¿¡ ÀúÀåµÈ´Ù.
                       ¿¹) 80x86 °è¿­Àº ÇÏÀ§ ¹ÙÀÌÆ® ºÎÅÍ, MC6800 °è¿­Àº ±×¹Ý´ë·Î
                       ÀúÀåµÈ´Ù.
               ³×Æ®¿÷ ¹ÙÀÌÆ® ¼ø¼­
                     : ºò ¿£µð¾ð
                       ³×Æ®¿÷¿¡¼­ ¹ÙÀÌÆ® ´ÜÀ§·Î ÀÚ·á°¡ Àü´ÞµÇ´Â ¼ø¼­¸¦ ¸»Çϴµ¥
                       2¹ÙÀÌÆ®ÀÇ ¼ö 0xC3E2ÀÇ °æ¿ì C3,E2ÀÇ ¼ø¼­·Î Áï, »óÀ§ ¹ÙÀÌÆ®
                       ºÎÅÍ Àü¼ÛµÈ´Ù.

                  @ µû¶ó¼­ 80x86°è¿­ÀÇ È£½ºÆ®¿Í MC6800°è¿­ÀÇ È£½ºÆ®°£ÀÇ Â÷ÀÌ
                    °¡ ¹ß»ýÇÏ°Ô µÈ´Ù À̸¦ ¹Ù·ÎÀâ±â À§ÇØ 80x86È£½ºÆ®ÀÇ °æ¿ì
                    È£½ºÆ® ¹ÙÀÌÆ® ¼ø¼­¸¦ ³×Æ®¿÷¿¡ º¸³»Áö±â Àü¿¡ ³×Æ®¿÷ ¹ÙÀÌÆ®
                    ¼ø¼­·Î º¯È¯(htonsÇÔ¼ö¸¦ ÀÌ¿ë)ÇØ¾ß ÇÑ´Ù.


              È£½ºÆ® ¹ÙÀÌÆ® ¿À´õ¸¦ ³×Æ®¿÷ ¹ÙÀÌÆ® ¿À´õ·Î º¯È¯Çϱâ À§ÇØ htons¸¦
              »ç¿ëÇϴ°ÍÀÌ´Ù.

              ÇѰ¡Áö´õ ±×·±µ¥ ¶È°°Àº ¹®ÀÚ¿­Àε¥ ¾î¶²³ðÀº º¯È¯Çϰí(üũ¼¶), ¾î¶²³ðÀº
              º¯È¯ ¾ÊÇÏ´ÂÁö(½Ã°£+'Q'184°³)°¡ ±Ã±ÝÇÏÁö ¾ÊÀºÁö.. ³­ ±Ã±ÝÇߴµ¥...

              ÀúÀÇ Á¼Àº »ý°¢¿£ pingÀ» ¶§·ÈÀ»¶§ ´ë»ó È£½ºÆ®°¡ ¸¸¾à¿¡ ³×Æ®¿÷ ¹ÙÀÌÆ® ¿À´õ
              ¸¦ »ç¿ëÇÏ´Â ³ðÀϰæ¿ì üũ¼¶À» ´Ù½Ã°è»êÈÄ ±×°ªÀ» ºñ±³ ÇÒÅÙµ¥(¿¡·¯°¡
              ÀÖ´ÂÁö È®ÀÌÇÏ·Á°í)±×¶§¸¦ ´ëºñÇØ¼­°¡ ¾Æ´Ò±î.. ÇÏÁö¸¸ ½Ã°£Àº º°´Ù¸¥ ó¸®
              ¾øÀÌ ±×´ë·Î µ¹·Á º¸³»´Ï±î º¯È¯ÀÌ ÇÊ¿ä¾øÁö ¾Ê³ª Çϰí..

              ¸¶Áö¸·À¸·Î sendto(packet,(destAddr,1))ÇÔ¼ö¸¦ ÀÌ¿ëÇØ ÆÐŶÀ» º¸³½´Ù.
              sendto´Â ÆÐŶÀ» ¸ñÀûÁöÁÖ¼Ò(destAddr)ÀÇ Æ¯Á¤Æ÷Æ®(icmp == 1)·Î º¸³½´Ù

              »ç¿ë¹ý sendto(packet, (host, port))
                     Âü°í) 1Àº icmpÀÇ ÇÁ·ÎÅäÄÝ ¹øÈ£ÀÌ´Ù getprotobyname('icmp')·Î
                           È®ÀÎÇØ º¸¸éµÊ

              ¿¡ÀÌ~~~ ¹º ÇÒ¸»ÀÌ À̸® ¸¹ÀºÁö...
              sendto´Â ¼ÒÄÏÀ»ÅëÇØ ÆÐŶÀ» º¸³»Áö¸¸ tcp¿¬°á ¼ÒÄϰú´Â ´Þ¸® ¿¬°áÀÌ µÇ¾î
              ÀÖÁö ¾ÊÀº »óÅ¿¡¼­ µ¿ÀÛÇÑ´Ù. ÀÌ°Ô Áß¿äÇÏ´Ù. Áö±Ý²¯ ¼ÒÄÏÀ» ¸¸µé±â¸¸ ÇßÁö
              ¾îµð¿¡µµ ¿¬°áµÇÁö ¾Ê¾Ò´Ù. ´ÜÁö »ý¼ÒÄÏÀ» ¸¸µé¾úÀ» »Ó Áö±Ý¿¡¼­¾ß ¾îµð·Î
              º¸³¾Áö°¡ °áÁ¤µÇ´Â °ÍÀÌ´Ù.

 73-92Çà  receiveOnePing(mySocket,ID,timeout)
           |
           +- Àμö :  mySocket »ý¼ÒÄÏ Áö½ÃÀÚ
           |          ID       ÇÎÀÇ ÇÁ·Î¼¼½º ID
           |          timeout
		   +- °á°ú :  ¼Ò¿äµÈ ½Ã°£

        sendOnePing¿¡¼­ º¸³½ ÆÐŶÀ» ±â´Ù·È´Ù°¡( ±â´Ù¸°´Ù ..À½ À̰ŠÁß¿äÇѵ¥..
        ¾Æ¹«Æ° Á»ÀÖ´Ù ¾ê±âÇÏÀÚ) µµÂøÇÑ ÆÐŶÀ» °¡Áö°í »©±âÇØ¼­ °á°ú¸¦ ¸®ÅÏÇÑ´Ù.

        ´ëÃæ »ìÆìº¸¸é ÀÌ·¯ÇÏ´Ù...
        °¡Àå ¸ÕÀú »ìÆìºÁ¾ß ÇÏ´Â°Ô 77ÇàÀÇ select.select([mySocket],[],[],timeLeft)
        Àε¥ Ȥ½Ã select°¡ ¹ºÁö ¾Æ½Ã³ª¿ä.. Àü ¸ô¶ú´Âµ¥

        ÀÚ ±×·³ selectÀÇ °ø½Ä¸íĪÀº "µ¿±âÀû ÀÔÃâ·Â ´ÙÁßÈ­","ºñºÀ¼â ÀÔÃâ·Â"
        »ç½Ç Çθ¸µå´Âµ¥ ±»ÀÌ select¸¦ ¾²Áö ¾Ê¾Æµµ µÈ´Ù. ±×·¯³ª ¾²´Â ÀÌÀ¯´Â ¸¸¾à
        »ç¿ëÇÏÁö ¾ÊÀ¸¸é 82Çà¿¡¼­ ¸¶³É ±â´Ù¸®´Â ºÒÇàÇÑ »çŰ¡ ¹ß»ýÇÒ ¼ö µµÀֱ⠶§
        ¹®ÀÌ´Ù.

        °ÅµÎÀý¹Ì Çϰí... select ¸¦ ÀÌ¿ëÇϸé Çѹø¿¡ ¿©·¯°³ÀÇ ÆÄÀÏ µð½ºÅ©¸³¼Ç¿¡¼­
        ¹ß»ýÇÏ´Â ÀÔÃâ·ÂÀ» µ¿½Ã¿¡ ó¸®ÇÒ¼ö ÀÖÀ¸¸ç, ÀÌ·¯ÇÑ Æ¯¼ºÀ» ÀÌ¿ëÇØ¼­ ºñºÀ¼â
        ÀÔÃâ·Â, ´ÙÁßŬ¶óÀÌ¾ðÆ®¸¦ Çϵµ·Ï ÇÒ ¼öµµ Àֱ⠶§¹®À̶õ´Ù.

        Âü ¾î·Æ°Ô ½á³ù´Ù.
        select¸¦ ¾²¸é 82Çà¿¡¼­ Ȥ½Ã ¹ß»ýÇÒÁö(±×·¸Áö ¾ÊÀ»°æ¿ì°¡ ´õ¸¹´Ù) ¸ð¸£´Â
        ºÀ¼â(cpu°¡ ´Ù¸¥ÀÏÀº ÇÏÁö¾Ê°í ÆÐŶÀÌ µµÂø Çϱ⸸À» ¸¶³É ±â´Ù¸®´Â)¸¦ ¹æÁöÇÒ
        ¼ö ÀÖ´Ù´Â ¾ê±â´Ù. cpu´Â ´Ù¸¥ÀÏÀ» ÇÏ´Ù°¡ ÆÐŶÀÌ µµÂøÇÏ¸é µµÂøÇß´Ù°í ¾Ë·Á
        ÁØ´Ù Áö±ÝÀº ÀÌ Á¤µµ·Î¸¸ ÀÌÇØÇÏ°í ³Ñ¾î°¡ÀÚ À̰ŠÀÚ¼¼È÷ ¼³¸íÇÏ¸é ¹èº¸´Ù ¹è²ÅÀÌ
        ´õÄ¿Áø´Ù.. ³ªÁß¿¡ µû·Î ¾ê±âÇϱâ·Î ÇÏÀÚ.

        ÀÏ´Ü »ç¿ë¹ý¸¸ ¾Ë¾Æº¸¸é

            »ç¿ë¹ý : select(iwtd, owtd, ewtd[, timeout])
                     iwtd -> ÀÐÀ» µ¥ÀÌŸ°¡ ¹ß»ýÇßÀ»¶§ ±ú¿ì±â ¿øÇÏ´Â ÆÄÀÏÁö½ÃÀÚ
                     owtd -> ¾µ µ¥ÀÌŸ°¡ ¹ß»ýÇßÀ»¶§ ±ú¿ì±â ¿øÇÏ´Â ÆÄÀÏÁö½ÃÀÚ
                     ewtd -> ¿¹¿Ü»óȲÀÌ ¹ß»ýÇßÀ»¶§ ±ú¿ì±â ¿øÇÏ´Â ÆÄÀÏÁö½ÃÀÚ
                     timeout -> ÁÖ¾îÁø½Ã°£(ÃÊ´ÜÀ§)ÀÌ Áö³ªµµ ÀÔ·Â,Ãâ·Â,¿¹¿Ü°¡ ¹ß»ý
                                ÇÏÁö ¾ÊÀ»°æ¿ì select´Â Á¾·áµÈ´Ù.
                     ¸®Åϰª -> À§ÀÇ ¾ÆÅ¥¸ÕÆ®µéÁß Ã³À½ ¼ÂÁß¿¡ »ç¿ëÁغñ°¡ µÈ°ÍÀ»
                               ¸®½ºÆ®·Î µÇµ¹·Á ÁØ´Ù

               Âü°í) °¢°¢ÀÇ ¾Æ±Ô¸ÕÆ®´Â ¸®½ºÆ® µéÀÌ´Ù. ÇѳðÀÌ ¾Æ´Ï°í ¿©·¯³ðÀÌ µÉ¼öµµ
                     ÀÖ´Ù.

        74-81Çà ³ªÁß¿¡ ½Ã°£À» ÃøÁ¤Çϱâ À§ÇØ ÇöÀç½Ã°£À» ±â·ÏÇϰí select¸¦ ÀÌ¿ëÇØ
        ±â´Ù¸®´Ù¸°´Ù. ¸¸¾à ½Ã°£ÀÌ ¸¸·áµÇ¸é Á¾·á(79Çà)

        82-83Çà µåµð¾î ±â´Ù¸®´ø ÆÐŶÀÌ µµÂøµÇ¾ú´Ù. recvformÀ»ÀÌ¿ë ÆÐŶÀ» Àоî¿Â´Ù
        icmp Çì´õ¸¦ Àд´Ù. ±Ùµ¥ ¿Ö20¹ÙÀÌÆ® ºÎÅÍ ÀÐÀ»±î? icmp´Â ip Çì´õ¿¡ ¼û°ÜÀú(?)¿Â´Ù
        µû¶ó¼­ óÀ½ 20¹ÙÀÌÆ®´Â ip Çì´õÀÌ´Ù.. ±×·¡¼­ °Ç³Ê ¶Ú°Å´Ù.

        84-85Çà unpackÀ» ÀÌ¿ëÇØ ¿ì¸®°¡ ÀÌÇØÇϱ⠽±µµ·Ï ÂɰմÙÀ½ id¸¦ ºñ±³ÇÑ´Ù.
        ¿Ö? id°¡ °°¾Æ¾ß ³»°¡ º¸³½ ÆÐŶÀ̴ϱî? ¾Æ´Ï¸é ³»°¡ º¸³½°Ô ¾Æ´Ï´Ù..

        86-88Çà ¸¶Áö¸·À¸·Î óÀ½ ÆÐŶ¸¸µé¶§ ±â·ÏÇØµÐ ½Ã°£À» Àоî¿Í ½Ã°£À» °è»êÇϰí
        °á°ú¸¦ ¸®ÅÏ.

        90-92Çà ÀÌ°Ç ¿Ö ÀÖÀ»±î? »©°í ÇØºÃ´Âµ¥µµ º°ÀÌ»ó¾øÀÌ µ¿À۵Ǵµ¥..À̳ðÀº
        ¹¹ ÇÏ´Â ³ðÀΰ¡? Á¦ »ý°¢¿£ ¹º°¡°¡ µµÂøÀº ÇßÁö¸¸ ³»°¡ ¸¸µé¾î º¸³½ ÆÐŶÀÌ ¾Æ
        ´Ñ °æ¿ì ¸¸¾à ÀÌ·± ÆÐŶÀÌ ÀÏÁ¤½Ã°£ °£°Ý(10ÃÊÀ̳»)À¸·Î °è¼Ó µµÂøÇÑ´Ù¸é
        ¾Æ¸¶ ÀÌ ÇÎ ÇÁ·Î±×·¥Àº °è¼Ó ¾Æ¹«°Íµµ È­¸é¿¡ Ç¥½ÃÇÏÁö ¾ÊÀº ä °è¼Ó µ¿ÀÛµÉ °Í
        ÀÌ´Ù.. ÀÌ·± °æ¿ì´Â ±ØÈ÷ µå¹°°ÚÁö¸¸ ÇØÄ¿°¡ ÀÌ»ç½ÇÀ» ¾È´Ù¸é... À¸ÈåÈåÈåÈå
        À̰ÍÀ» ¹æÁöÇÏ·Á°í ¸¸µéÁö ¾Ê¾Ò³ª Çϰí ÁüÀ۵˴ϴÙ.