【问题标题】:Why doesn't the handle_read method get called with asyncore?为什么不使用 asyncore 调用 handle_read 方法?
【发布时间】:2010-10-17 21:08:13
【问题描述】:

我正在尝试使用异步调度程序(下面的代码)通过数据包套接字对发送/接收进行原型类型。尽管我的 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()


提前致谢。

【问题讨论】:

    标签: python sockets packet


    【解决方案1】:

    在一位同事的帮助下,我终于完成了这项工作。这与将协议参数传递给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()
    
    
    

    谢谢,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-01
      • 2018-03-26
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多