Я новичок в python. Я кодировал инструмент ping. Во-первых, я выполнил его с 22 mask. Затем он работает нормально. После этого я выполнил его с 16 mask.but, я распознал потерю пакета (используя Wireshark). Я не менял время ожидания. И моя скорость inte rnet выше, чем скорость отправки пакетов (я рассчитал это). Каковы причины потери пакетов и Как уменьшить потерю пакетов?
#!/usr/local/bin/python3
import socket
from multiprocessing import Process
from time import sleep
def sender(ip):
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
for y in ip:
s.sendto(bytes.fromhex('08004d05000100566162636465666768696a6b6c6d6e6f7071727374757677616263646566676869'),(y,socket.IPPROTO_ICMP))
sleep(0.001)
s.close()
def sniffer(so):
i=0
while True:
c=so.recvfrom(1024)
if c[0].hex()[40:44]=='0000':
print(c[1][0])
i=i+1
print(i)
ip=input("IP :")
mask=int(input("Mask :"))
ip_parts=ip.split('.')
hosts_h=32-mask
hosts=(2**hosts_h)-2
ip_pb=[]
ip_pb.append(format(int(ip_parts[0]), '08b'))
ip_pb.append(format(int(ip_parts[1]), '08b'))
ip_pb.append(format(int(ip_parts[2]), '08b'))
ip_pb.append(format(int(ip_parts[3]), '08b'))
ip_b=str(ip_pb[0])+str(ip_pb[1])+str(ip_pb[2])+str(ip_pb[3])
network_bits=ip_b[0:mask]
ip_re=[]
i=1
while i <= hosts:
ip_r=str(network_bits)+str(format(i, '0'+str(hosts_h)+'b'))
ip_re.append(str(int(ip_r[0:8],2))+"."+str(int(ip_r[8:16],2))+"."+str(int(ip_r[16:24],2))+"."+str(int(ip_r[24:32],2)))
i=i+1
if __name__ == '__main__':
so = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
p1 = Process(target=sniffer,args=(so,))
p1.start()
p2 = Process(target=sender,args=(ip_re,))
p2.start()
p1.join(200)
p2.join()
if p1.is_alive():
p1.terminate()
p1.join()
so.close()