2009-04-06 6 views
1

J'essaye de proto-type envoyer/recv via un socket de paquet en utilisant le répartiteur asyncore (code ci-dessous). Bien que ma méthode handle_write soit appelée rapidement, la méthode handle_read ne semble pas être invoquée. La boucle() appelle la méthode lisible de temps en temps, mais je ne peux rien recevoir. Je sais qu'il y a des paquets reçus sur eth0 car un simple tcpdump montre les paquets entrants. Est-ce que je manque quelque chose?Pourquoi la méthode handle_read n'est-elle pas appelée avec 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() 


Merci d'avance.

Répondre

1

J'ai finalement réussi à travailler avec l'aide d'un collègue. Cela a à voir avec la transmission de l'argument du protocole à la méthode create_socket(). Malheureusement create_socket() du répartiteur ne prend pas un troisième argument - donc j'ai dû modifier mon constructeur packet_socket() pour prendre un socket pré-créé avec le protocole comme ETH_P_ALL (ou quel que soit le type de protocole que vous désirez recevoir) comme argument. Code modifié ci-dessous:



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


Merci,

Questions connexes