Python 为什么';handle\u read方法不是通过asyncore调用的吗?

Python 为什么';handle\u read方法不是通过asyncore调用的吗?,python,sockets,packet,Python,Sockets,Packet,我正在尝试使用asyncore dispatcher(下面的代码)通过数据包套接字原型send/recv。虽然我的handle\u write方法被迅速调用,但是handle\u read方法似乎没有被调用。loop()确实每隔一段时间调用readable方法,但我无法接收任何内容。我知道eth0上接收到数据包,因为一个简单的tcpdump会显示传入的数据包。我错过什么了吗 #!/usr/bin/python import asyncore, socket, IN, struct cla

我正在尝试使用asyncore dispatcher(下面的代码)通过数据包套接字原型send/recv。虽然我的handle\u write方法被迅速调用,但是handle\u read方法似乎没有被调用。loop()确实每隔一段时间调用readable方法,但我无法接收任何内容。我知道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\u socket()
方法有关。不幸的是,dispatcher的
create\u socket()
没有使用第三个参数,因此我不得不修改我的
packet\u socket()
构造函数,将预先创建的协议为
ETH\u P\u 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()



谢谢,

在一位同事的帮助下,我终于完成了这项工作。这与将协议参数传递给
create\u socket()
方法有关。不幸的是,dispatcher的
create\u socket()
没有使用第三个参数,因此我不得不修改我的
packet\u socket()
构造函数,将预先创建的协议为
ETH\u P\u 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()


谢谢