Уведомления

Группа в Telegram: присоединиться | Jabber-конференция сообщества: pythonua@conference.jabber.ru

#1 Авг. 10, 2017 11:48:05

Toxins
Зарегистрирован: 2017-08-10
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

ICMP echo и socket_raw

Привет всем! В образовательных для себя целях решил написать программу которая будет отправлять 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))
Дело в том, что в ответ я получаю пакеты с icmp заголовком (3, 1, контрольная_сумма, 0, 0, ('ip-address', 0))

Не могу разобраться почему так происходит и то ли я вообще делаю.
Прошу помочь

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version