Сервер сокетов Python icmp (не tcp \ udp) - PullRequest
2 голосов
/ 23 ноября 2011

Я пытаюсь написать сервер сокетов на Python, который может принимать ICMP-пакеты.

Вот мой код:

s = socket.socket(socket.AF_INET,socket.SOCK_RAW, socket.IPPROTO_ICMP)
host = socket.gethostbyname(socket.gethostname())
s.bind((host,0))
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

Однако я не знаю, как получать пакеты - я пытался использовать s.listen, но это не удалось. Чего мне не хватает или я совершенно не в том направлении?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 23 ноября 2011

Я сделал это раньше в витой, и я настроил сокет так:

import socket

def listen():
  s = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_ICMP)
  s.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1)
  while 1:
    data, addr = s.recvfrom(1508)
    print "Packet from %r: %r" % (addr,data)
0 голосов
/ 31 декабря 2017

Основываясь на принятом ответе, этот код распаковывает полученный заголовок ICMP и отображает его данные (тип ICMP, код и т. Д.)

    s = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_ICMP)
    s.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1)
    while 1:
        recPacket, addr = s.recvfrom(1024)
        icmp_header = recPacket[20:28]
        type, code, checksum, p_id, sequence = struct.unpack('bbHHh', icmp_header)
        print "type: [" + str(type) + "] code: [" + str(code) + "] checksum: [" + str(checksum) + "] p_id: [" + str(p_id) + "] sequence: [" + str(sequence) + "]"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...