17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 | #coding=utf-8 #!/usr/bin/python import os, sys, socket, struct, select, time, threading if sys.platform = = "win32" : # On Windows, the best timer is time.clock() default_timer = time.clock else : # On most other platforms the best timer is time.time() default_timer = time.time # From /usr/include/linux/icmp.h; your milage may vary. ICMP_ECHO_REQUEST = 8 # Seems to be the same on Solaris. global Pingsum #定義全局列表 def checksum(source_string): """ I'm not too confident that this is right but testing seems to suggest that it gives the same answers as in_cksum in ping.c """ sum = 0 countTo = ( len (source_string) / 2 ) * 2 count = 0 while count<countTo: thisVal = ord (source_string[count + 1 ]) * 256 + ord (source_string[count]) sum = sum + thisVal sum = sum & 0xffffffff # Necessary? count = count + 2 if countTo< len (source_string): sum = sum + ord (source_string[ len (source_string) - 1 ]) sum = sum & 0xffffffff # Necessary? sum = ( sum >> 16 ) + ( sum & 0xffff ) sum = sum + ( sum >> 16 ) answer = ~ sum answer = answer & 0xffff # Swap bytes. Bugger me if I know why. answer = answer >> 8 | (answer << 8 & 0xff00 ) return answer def receive_one_ping(my_socket, ID , timeout): """ receive the ping from the socket. """ timeLeft = timeout while True : startedSelect = default_timer() whatReady = select.select([my_socket], [], [], timeLeft) howLongInSelect = (default_timer() - startedSelect) if whatReady[ 0 ] = = []: # Timeout return timeReceived = default_timer() recPacket, addr = my_socket.recvfrom( 1024 ) icmpHeader = recPacket[ 20 : 28 ] type , code, checksum, packetID, sequence = struct.unpack( "bbHHh" , icmpHeader ) # Filters out the echo request itself. # This can be tested by pinging 127.0.0.1 # You'll see your own request if type ! = 8 and packetID = = ID : bytesInDouble = struct.calcsize( "d" ) timeSent = struct.unpack( "d" , recPacket[ 28 : 28 + bytesInDouble])[ 0 ] return timeReceived - timeSent timeLeft = timeLeft - howLongInSelect if timeLeft < = 0 : return def send_one_ping(my_socket, dest_addr, ID ): """ Send one ping to the given >dest_addr<. """ dest_addr = socket.gethostbyname(dest_addr) # Header is type (8), code (8), checksum (16), id (16), sequence (16) my_checksum = 0 # Make a dummy heder with a 0 checksum. header = struct.pack( "bbHHh" , ICMP_ECHO_REQUEST, 0 , my_checksum, ID , 1 ) # bytesInDouble = struct.calcsize("d") # data = (192 - bytesInDouble) * "Q" data = "Fuck You " * 8 data = struct.pack( "d" , default_timer()) + data # Calculate the checksum on the data and the dummy header. my_checksum = checksum(header + data) # Now that we have the right checksum, we put that in. It's just easier # to make up a new header than to stuff it into the dummy. header = struct.pack( "bbHHh" , ICMP_ECHO_REQUEST, 0 , socket.htons(my_checksum), ID , 1 ) packet = header + data my_socket.sendto(packet, (dest_addr, 1 )) # Don't know about the 1 def do_one(dest_addr, timeout): """ Returns either the delay (in seconds) or none on timeout. """ icmp = socket.getprotobyname( "icmp" ) try : my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp) except socket.error, (errno, msg): if errno = = 1 : # Operation not permitted msg = msg + ( " - Note that ICMP messages can only be sent from processes" " running as root." ) raise socket.error(msg) raise # raise the original error my_ID = os.getpid() & 0xFFFF send_one_ping(my_socket, dest_addr, my_ID) delay = receive_one_ping(my_socket, my_ID, timeout) my_socket.close() return delay def verbose_ping(dest_addr, count ,timeout = 1 ): #非默認(rèn)參數(shù)要放在最后 """ Send >count< ping to >dest_addr< with the given >timeout< and display the result. """ for i in xrange (count): #print "ping %s " % dest_addr, try : delay = do_one(dest_addr, timeout) except socket.gaierror, e: print "failed. (socket error: '%s')" % e[ 1 ], break if delay = = None : sys.stdout.write( "." ) #timeout else : delay = delay * 1000 sys.stdout.write( "!" ) Pingsum.append(delay) if __name__ = = '__main__' : while ( 1 ): Pingsum = []; ntime = time.strftime( "%Y-%m-%d %H:%M:%S" , time.localtime()) print "\n=======================================================" print " " ,ntime dest_addr = raw_input ( " Please input address or name: " ) count = int ( raw_input ( " Please input counts: " )) print " Will ping: " + dest_addr + " %d" % count + " counts" print "========================================================" try : start = time.clock() if count< = 100 : m = 1 else : m = count / / 100 countyu = count % m for n in range (m): t1 = threading.Thread(target = verbose_ping,args = (dest_addr,count / / m)) t1.start() t2 = threading.Thread(target = verbose_ping,args = (dest_addr,countyu)) t2.start() t1.join() t2.join() end = time.clock() time.sleep( 0.3 ) print "\n Program use time is:%.5fms" % (end - start) print " max is %0.4fms" % max (Pingsum), print " avg is %0.4fms" % ( sum (Pingsum) / count), print " min is %0.4fms" % min (Pingsum) print " send is :%d " % count, print " receive is :%s " % ( len (Pingsum)), print " loss is: %0.4f" % (( 1 - len (Pingsum) / float (count)) * 100 ) + "%" with open ( "ping.txt" , "wb+" ) as f: f.write( "Will ping: " + dest_addr + " %d" % count + " counts" + "\r\n" ) for i in range ( len (Pingsum)): f.write( "Seq-%d" % (i + 1 ) + " Receive " + "%s is: " % dest_addr + " %0.4fms" % (Pingsum[i]) + "\r\n" ); f.write( "Program use time is:%.5fms" % (end - start) + "\r\n" + "max is %0.4fms" % max (Pingsum) + " avg is %0.4fms" % ( sum (Pingsum) / count) + " min is %0.4fms" % min (Pingsum) + "\r\n" ); f.write( "send is: %d" % count + " receive is :%s " % ( len (Pingsum)) + " loss is: %0.4f" % (( 1 - len (Pingsum) / float (count)) * 100 ) + "%" ) except : print " SOMETHING IS ERROR " |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 | #coding=utf-8 #!/usr/bin/python import os, sys, socket, struct, select, time, threading if sys.platform = = "win32" : # On Windows, the best timer is time.clock() default_timer = time.clock else : # On most other platforms the best timer is time.time() default_timer = time.time # From /usr/include/linux/icmp.h; your milage may vary. ICMP_ECHO_REQUEST = 8 # Seems to be the same on Solaris. global Pingsum #定義全局列表 def checksum(source_string): """ I'm not too confident that this is right but testing seems to suggest that it gives the same answers as in_cksum in ping.c """ sum = 0 countTo = ( len (source_string) / 2 ) * 2 count = 0 while count<countTo: thisVal = ord (source_string[count + 1 ]) * 256 + ord (source_string[count]) sum = sum + thisVal sum = sum & 0xffffffff # Necessary? count = count + 2 if countTo< len (source_string): sum = sum + ord (source_string[ len (source_string) - 1 ]) sum = sum & 0xffffffff # Necessary? sum = ( sum >> 16 ) + ( sum & 0xffff ) sum = sum + ( sum >> 16 ) answer = ~ sum answer = answer & 0xffff # Swap bytes. Bugger me if I know why. answer = answer >> 8 | (answer << 8 & 0xff00 ) return answer def receive_one_ping(my_socket, ID , timeout): """ receive the ping from the socket. """ timeLeft = timeout while True : startedSelect = default_timer() whatReady = select.select([my_socket], [], [], timeLeft) howLongInSelect = (default_timer() - startedSelect) if whatReady[ 0 ] = = []: # Timeout return timeReceived = default_timer() recPacket, addr = my_socket.recvfrom( 1024 ) icmpHeader = recPacket[ 20 : 28 ] type , code, checksum, packetID, sequence = struct.unpack( "bbHHh" , icmpHeader ) # Filters out the echo request itself. # This can be tested by pinging 127.0.0.1 # You'll see your own request if type ! = 8 and packetID = = ID : bytesInDouble = struct.calcsize( "d" ) timeSent = struct.unpack( "d" , recPacket[ 28 : 28 + bytesInDouble])[ 0 ] return timeReceived - timeSent timeLeft = timeLeft - howLongInSelect if timeLeft < = 0 : return def send_one_ping(my_socket, dest_addr, ID ): """ Send one ping to the given >dest_addr<. """ dest_addr = socket.gethostbyname(dest_addr) # Header is type (8), code (8), checksum (16), id (16), sequence (16) my_checksum = 0 # Make a dummy heder with a 0 checksum. header = struct.pack( "bbHHh" , ICMP_ECHO_REQUEST, 0 , my_checksum, ID , 1 ) # bytesInDouble = struct.calcsize("d") # data = (192 - bytesInDouble) * "Q" data = "Fuck You " * 8 data = struct.pack( "d" , default_timer()) + data # Calculate the checksum on the data and the dummy header. my_checksum = checksum(header + data) # Now that we have the right checksum, we put that in. It's just easier # to make up a new header than to stuff it into the dummy. header = struct.pack( "bbHHh" , ICMP_ECHO_REQUEST, 0 , socket.htons(my_checksum), ID , 1 ) packet = header + data my_socket.sendto(packet, (dest_addr, 1 )) # Don't know about the 1 def do_one(dest_addr, timeout): """ Returns either the delay (in seconds) or none on timeout. """ icmp = socket.getprotobyname( "icmp" ) try : my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp) except socket.error, (errno, msg): if errno = = 1 : # Operation not permitted msg = msg + ( " - Note that ICMP messages can only be sent from processes" " running as root." ) raise socket.error(msg) raise # raise the original error my_ID = os.getpid() & 0xFFFF send_one_ping(my_socket, dest_addr, my_ID) delay = receive_one_ping(my_socket, my_ID, timeout) my_socket.close() return delay def verbose_ping(dest_addr, count ,timeout = 1 ): #非默認(rèn)參數(shù)要放在最后 """ Send >count< ping to >dest_addr< with the given >timeout< and display the result. """ for i in xrange (count): #print "ping %s " % dest_addr, try : delay = do_one(dest_addr, timeout) except socket.gaierror, e: print "failed. (socket error: '%s')" % e[ 1 ], break if delay = = None : sys.stdout.write( "." ) #timeout else : delay = delay * 1000 sys.stdout.write( "!" ) Pingsum.append(delay) if __name__ = = '__main__' : while ( 1 ): Pingsum = []; ntime = time.strftime( "%Y-%m-%d %H:%M:%S" , time.localtime()) print "\n=======================================================" print " " ,ntime dest_addr = raw_input ( " Please input address or name: " ) count = int ( raw_input ( " Please input counts: " )) print " Will ping: " + dest_addr + " %d" % count + " counts" print "========================================================" try : start = time.clock() if count< = 100 : m = 1 else : m = count / / 100 countyu = count % m for n in range (m): t1 = threading.Thread(target = verbose_ping,args = (dest_addr,count / / m)) t1.start() t2 = threading.Thread(target = verbose_ping,args = (dest_addr,countyu)) t2.start() t1.join() t2.join() end = time.clock() time.sleep( 0.3 ) print "\n Program use time is:%.5fms" % (end - start) print " max is %0.4fms" % max (Pingsum), print " avg is %0.4fms" % ( sum (Pingsum) / count), print " min is %0.4fms" % min (Pingsum) print " send is :%d " % count, print " receive is :%s " % ( len (Pingsum)), print " loss is: %0.4f" % (( 1 - len (Pingsum) / float (count)) * 100 ) + "%" with open ( "ping.txt" , "wb+" ) as f: f.write( "Will ping: " + dest_addr + " %d" % count + " counts" + "\r\n" ) for i in range ( len (Pingsum)): f.write( "Seq-%d" % (i + 1 ) + " Receive " + "%s is: " % dest_addr + " %0.4fms" % (Pingsum[i]) + "\r\n" ); f.write( "Program use time is:%.5fms" % (end - start) + "\r\n" + "max is %0.4fms" % max (Pingsum) + " avg is %0.4fms" % ( sum (Pingsum) / count) + " min is %0.4fms" % min (Pingsum) + "\r\n" ); f.write( "send is: %d" % count + " receive is :%s " % ( len (Pingsum)) + " loss is: %0.4f" % (( 1 - len (Pingsum) / float (count)) * 100 ) + "%" ) except : print " SOMETHING IS ERROR " |
聯(lián)系客服