Форум сайта python.su
Привет всем! В образовательных для себя целях решил написать программу которая будет отправлять 1 icmp echo запрос и получать ответный. Хочу разобраться с raw_socet на примере это задачи.
Руководствовался следующими ресурсами:
https://github.com/corentone/python3-ping/blob/e821b38f532285238f24d12e170021ff26bb7165/ping.py
https://github.com/pferate/python_ping
Вот мой код:
# -*- coding: utf-8 -*- import os import socket import struct import time
def checksum (string_to_check): #Честно скопипастил из первого источника, но предварительно разобрался что к чему sum = 0 countTo = (len(string_to_check)/2)*2 count = 0 while count<countTo: thisVal = string_to_check[count + 1]*256 + string_to_check[count] sum = sum + thisVal sum = sum & 0xFFFFFFFF count = count + 2 if countTo<len(string_to_check): sum = sum + string_to_check[len(string_to_check) + 1] sum = sum & 0xFFFFFFFF sum = (sum >> 16) + (sum & 0xFFFF) sum = sum + (sum >> 16) answer = ~sum answer = answer & 0xFFFF answer = answer >> 8 | (answer << 8 & 0xFF00) return answer
def BULD_ICMP_PACKET(icmp_identifier, icmp_sequence): icmp_checksum = 0 icmp_header = struct.pack("!BBHHH", 8, 0, icmp_checksum, icmp_identifier, icmp_sequence) bytesInDouble = struct.calcsize("d") icmp_data = bytes((192 - bytesInDouble) * 'Q', 'utf-8') icmp_data = struct.pack("d", time.time() ) + icmp_data icmp_checksum = checksum(icmp_header + icmp_data) icmp_header = struct.pack("!BBHHH", 8, 0, socket.htons(icmp_checksum), icmp_identifier, icmp_sequence) packet = icmp_header + icmp_data return packet #, socket.htons(icmp_checksum)
def SEND_ONE(icmp_identifier, icmp_sequence, dst_addr, use_socket): packet = BULD_ICMP_PACKET(icmp_identifier, icmp_sequence) destination_address = socket.gethostbyname(dst_addr) print(struct.unpack("!BBHHH",packet[0:8])) use_socket.sendto(packet, (destination_address, 1)) recPacket, addr = use_socket.recvfrom(1024) recPacketHeader = recPacket[20:28] icmp_type_r, icmp_code_r, icmp_checksum_r, icmp_identifier_r, icmp_sequence_r = struct.unpack("!BBHHH", recPacketHeader) use_socket.close() return icmp_type_r, icmp_code_r, icmp_checksum_r, icmp_identifier_r, icmp_sequence_r, addr
my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
print(SEND_ONE(os.getpid() & 0xFFFF, 1,'8.8.8.8',my_socket))
Офлайн