Python sends ICMP echo requesy request
Copy Code code as follows:
Import socket
Import struct
def checksum (source_string):
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
Count = Count + 2
If Countto<len (source_string):
sum = sum + ord (Source_string[len (source_string)-1])
sum = sum & 0xFFFFFFFF
sum = (sum >>) + (sum & 0xffff)
sum = sum + (sum >> 16)
Answer = ~sum
Answer = answer & 0xFFFF
Answer = Answer >> 8 | (Answer << 8 & 0xff00)
Return answer
def ping (IP):
s = socket.socket (socket.af_inet, socket. Sock_raw, 1)
Packet = Struct.pack (
"! Bbhhh ", 8, 0, 0, 0, 0
)
Chksum=checksum (Packet)
Packet = Struct.pack (
"! Bbhhh ", 8, 0, chksum, 0, 0
)
S.sendto (packet, (IP, 1))
If __name__== ' __main__ ':
Ping (' 192.168.41.56 ')
Scan detection network function (Network detector)
Copy Code code as follows:
#!/usr/bin/env Python3
#-*-Coding:utf-8-*-
'''
Probe the network host to survive.
'''
Import OS
Import struct
Import Array
Import time
Import socket
Import ipy
Import threading
Class Sendpingthr (threading. Thread):
'''
The thread that sent the ICMP request message.
Parameters:
Ippool--An iterative IP address pool
Icmppacket--Constructed ICMP message
Icmpsocket--ICMP socket connection
Timeout--Setting send timeout
'''
def __init__ (self, ippool, Icmppacket, Icmpsocket, timeout=3):
Threading. Thread.__init__ (self)
Self. Sock = Icmpsocket
Self.ippool = Ippool
Self.packet = Icmppacket
Self.timeout = Timeout
Self. Sock.settimeout (timeout + 3)
def run (self):
Time.sleep (0.01) #等待接收线程启动
For IP in Self.ippool:
Try
Self. Sock.sendto (self.packet, (IP, 0))
Except Socket.timeout:
Break
Time.sleep (Self.timeout)
Class Nscan:
'''
Parameters:
Timeout--socket timeout, default 3 seconds
IPV6--is IPV6, default is False
'''
def __init__ (self, timeout=3, ipv6=false):
Self.timeout = Timeout
Self. IPV6 = IPv6
Self.__data = Struct.pack (' d ', Time.time ()) #用于ICMP报文的负荷字节 (8bit)
self.__id = Os.getpid () #构造ICMP报文的ID字段, no practical significance
@property #属性装饰器
def __icmpsocket (self):
' Create an ICMP Socket '
If not self. IPV6:
Sock = Socket.socket (socket.af_inet, socket. Sock_raw, Socket.getprotobyname ("ICMP")
Else
Sock = Socket.socket (SOCKET.AF_INET6, socket. Sock_raw, Socket.getprotobyname ("ipv6-icmp"))
Return sock
def __incksum (self, packet):
"' ICMP message Parity and calculation method '"
If Len (packet) & 1:
Packet = packet + ' "
Words = Array.array (' h ', packet)
sum = 0
For word in words:
sum + = (Word & 0xFFFF)
sum = (sum >>) + (sum & 0xffff)
sum = sum + (sum >> 16)
Return (~sum) & 0xFFFF
@property
def __icmppacket (self):
' Construct ICMP message '
If not self. IPV6:
Header = Struct.pack (' bbhhh ', 8, 0, 0, self.__id, 0) # TYPE, CODE, chksum, ID, SEQ
Else
Header = Struct.pack (' bbhhh ', 128, 0, 0, self.__id, 0)
Packet = header + self.__data # packet without checksum
Chksum = self.__incksum (packet) # make checksum
If not self. IPV6:
Header = Struct.pack (' bbhhh ', 8, 0, Chksum, self.__id, 0)
Else
Header = Struct.pack (' bbhhh ', 128, 0, Chksum, self.__id, 0)
Return header + Self.__data # packet *with* checksum
def isunip (self, IP):
"To determine whether IP is a legitimate unicast address"
IP = [Int (x) for x in Ip.split ('. ') if X.isdigit ()]
If Len (IP) = = 4:
if (0 < ip[0] < 223 and ip[0]!= 127 and Ip[1] < 256 and ip[2] < 256 and 0 < ip[3] < 255):
Return True
Return False
def makeippool (self, StartIP, Lastip):
"Production IP address Pool"
Ipver = 6 if self. IPV6 Else 4
Intip = lambda Ip:IPy.IP (IP). Int ()
Ippool = {Ipy.inttoip (IP, ipver) for IP in range (Intip (StartIP), Intip (Lastip) +1)}
return {IP to IP in ippool if Self.isunip (IP)}
def mping (self, Ippool):
"" Using ICMP packets to detect the existence of a network host
Parameters:
Ippool--An iterative IP address pool
'''
Sock = Self.__icmpsocket
Sock.settimeout (Self.timeout)
Packet = Self.__icmppacket
Recvfroms = set () #接收线程的来源IP地址容器
Sendthr = Sendpingthr (ippool, packet, sock, self.timeout)
Sendthr.start ()
While True:
Try
Recvfroms.add (Sock.recvfrom (1024) [1][0])
Except Exception:
Pass
Finally
If not sendthr.isalive ():
Break
Return Recvfroms & Ippool
If __name__== ' __main__ ':
s = Nscan ()
Ippool = S.makeippool (' 192.168.0.1 ', ' 192.168.0.254 ')
Print (S.mping (ippool))