xilebo noone | Bonjour,
Dommage d'utiliser python et de faire des appels "system" ( CreateProcess ) derrière.
Y a 36 façons de faire ça plus propre.
Soit t'utilises une bibliothèque python qui te gère déjà le ping, et c'est sûr qu'il y en a au moins une
- pip install ping3
Code :
- from ping3 import ping, verbose_ping
- delay = ping("127.0.0.1" )
- verbose_ping("hardware.fr" , count = 4)
|
- pip install pythonping
Code :
- from pythonping import ping
- ping('8.8.8.8', count=4, timeout=2)
|
Ou plus roots, ping c'est le protocole ICMP, code commande n°8, tu fais des raw_socket et tu reconstruis le paquet icmp.
Code :
- import socket
- import struct
- import time
- import os
- ICMP_ECHO_REQUEST = 8
- def checksum(data):
- if len(data) % 2:
- data += b'\x00'
- s = sum(struct.unpack("!%dH" % (len(data)//2), data))
- s = (s >> 16) + (s & 0xffff)
- s += s >> 16
- return ~s & 0xffff
- def create_packet(id):
- header = struct.pack('!BBHHH', ICMP_ECHO_REQUEST, 0, 0, id, 1)
- payload = b'HFRISTHEBEST'
- chksum = checksum(header + payload)
- header = struct.pack('!BBHHH', ICMP_ECHO_REQUEST, 0, chksum, id, 1)
- return header + payload
- def ping(dest_addr, timeout=1):
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
- except PermissionError:
- print("error" )
- return
- sock.settimeout(timeout)
- packet_id = os.getpid() & 0xFFFF
- packet = create_packet(packet_id)
- sock.sendto(packet, (dest_addr, 1))
-
- start_time = time.time()
- try:
- recv_packet, addr = sock.recvfrom(1024)
- elapsed = (time.time() - start_time) * 1000
- print(f"Réponse de {addr[0]} en {elapsed:.2f} ms" )
- except socket.timeout:
- print("Timeout" )
- finally:
- sock.close()
- ping("forum.hardware.fr" )
|
Message édité par xilebo le 16-03-2026 à 21:36:09
|