Por que não o método handle_read são chamados com asyncore?
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.
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,