2009-04-06 14 views
1

私はプロトタイプsend/recvをパケットソケット経由で、asyncoreディスパッチャー(下記のコード)を使用して試しています。私のhandle_writeメソッドは即座に呼び出されますが、handle_readメソッドは呼び出されないようです。 loop()は読み込み可能なメソッドを頻繁に呼び出しますが、何も受け取ることができません。単純なtcpdumpが入ってくるパケットを表示するので、eth0で受信したパケットがあることを知っています。何か不足していますか?なぜhandle_readメソッドがasyncoreで呼び出されないのですか?



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


ありがとうございます。

答えて

1

私は結局、同僚の助けを借りてこれを動作させました。これは、プロトコル引数をcreate_socket()メソッドに渡すことと関係しています。残念ながら、ディスパッチャーのcreate_socket()は3番目の引数を取らないので、コンストラクタを、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() 


おかげで、

関連する問題