Pergunta

Eu estou tentando proto-tipo envio / recv através de uma tomada de pacotes usando o despachante asyncore (código abaixo). Embora o meu método handle_write é chamado prontamente, o método handle_read não parecem ter invocado. O loop () faz chamar o método legível de vez em quando, mas eu não sou capaz de receber qualquer coisa. Eu sei que existem pacotes recebidos em eth0 porque uma simples mostra tcpdump incoming pacotes. Estou esquecendo de algo?



#!/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()


Agradecemos antecipadamente.

Foi útil?

Solução

Eu finalmente consegui isso para o trabalho com a ajuda de um colega de trabalho. Isto tem a ver com passar o argumento de protocolo para o método create_socket(). Infelizmente create_socket() do distribuidor não é preciso um terceiro argumento - por isso tive de modificar meu Construtor packet_socket() tomar uma tomada pré-criado com o protocolo como ETH_P_ALL (ou qualquer outro tipo de protocolo que você deseja receber) como um argumento. código editado abaixo:



#!/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()


Obrigado,

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top