Почему метод handle_read не вызывается с помощью asyncore?

StackOverflow https://stackoverflow.com/questions/722605

  •  05-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь прототипировать отправку/получение через пакетный сокет, используя диспетчер асинхронности (код ниже).Хотя мой метод handle_write вызывается быстро, метод handle_read, похоже, не вызывается.Loop() время от времени вызывает читаемый метод, но я не могу ничего получить.Я знаю, что на eth0 получены пакеты, потому что простой tcpdump показывает входящие пакеты.Я что-то пропустил?



#!/usr/bin/python

import asyncore, socket, IN, struct

class packet_socket(asyncore.dispatcher):

    def __init__(self):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_PACKET, socket.SOCK_RAW)
        self.buffer = '0180C20034350012545900040060078910'
        self.socket.setsockopt(socket.SOL_SOCKET,IN.SO_BINDTODEVICE,struct.pack("%ds" % (len("eth0")+1,), "eth0"))

    def handle_close(self):
        self.close()

    def handle_connect(self):
        pass

    def handle_read(self):
        print "handle_read() called"
        data,addr=self.recvfrom(1024)
        print data
        print addr

    def readable(self):
        print "Checking read flag"
        return True

    def writable(self):
        return (len(self.buffer) > 0)

    def handle_write(self):
        print "Writing buffer data to the socket"
        sent = self.sendto(self.buffer,("eth0",0xFFFF))
        self.buffer = self.buffer[sent:]

c = packet_socket()

asyncore.loop()


Заранее спасибо.

Это было полезно?

Решение

Я наконец-то заставил это работать с некоторой помощью коллеги.Это связано с передачей аргумента протокола в create_socket() метод.К сожалению create_socket() диспетчера не принимает третий аргумент, поэтому мне пришлось изменить свой packet_socket() конструктор для использования предварительно созданного сокета с протоколом в качестве ETH_P_ALL (или любой другой тип протокола, который вы хотите получить) в качестве аргумента.Отредактированный код ниже:



#!/usr/bin/python

import asyncore, socket, IN, struct

proto=3
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3))
s.bind(("eth0",proto))

class packet_socket(asyncore.dispatcher):

    def __init__(self,sock):
        asyncore.dispatcher.__init__(self,sock)
        #self.create_socket(socket.AF_PACKET, socket.SOCK_RAW,socket.htons(3))
        self.buffer = '0180C20034350012545900040060078910'
        self.socket.setsockopt(socket.SOL_SOCKET,IN.SO_BINDTODEVICE,struct.pack("%ds" % (len("eth0")+1,), "eth0"))

    def handle_close(self):
        self.close()

    def handle_connect(self):
        pass

    def handle_read(self):
        print "handle_read() called" 
    data,addr=self.recvfrom(1024)
        print data
        print addr

    def readable(self):
        print "Checking read flag" 
    return True

    def writable(self):
        return (len(self.buffer) > 0)

    def handle_write(self):
        print "Writing buffer data to the socket" 
    sent = self.sendto(self.buffer,("eth0",0xFFFF))
        self.buffer = self.buffer[sent:]

c = packet_socket(s)

asyncore.loop()


Спасибо,

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top