°¥°¡¸¶±¸ ´Ô²²¼ ¾²½Å ±ÛÀÔ´Ï´Ù.
(¿Ã¸° ³¯ : 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ÃÊÀ̳»)À¸·Î °è¼Ó µµÂøÇÑ´Ù¸é
¾Æ¸¶ ÀÌ ÇÎ ÇÁ·Î±×·¥Àº °è¼Ó ¾Æ¹«°Íµµ ȸ鿡 Ç¥½ÃÇÏÁö ¾ÊÀº ä °è¼Ó µ¿ÀÛµÉ °Í
ÀÌ´Ù.. ÀÌ·± °æ¿ì´Â ±ØÈ÷ µå¹°°ÚÁö¸¸ ÇØÄ¿°¡ ÀÌ»ç½ÇÀ» ¾È´Ù¸é... À¸ÈåÈåÈåÈå
À̰ÍÀ» ¹æÁöÇÏ·Á°í ¸¸µéÁö ¾Ê¾Ò³ª Çϰí ÁüÀ۵˴ϴÙ.