2010-12-09 5 views
2

Je rencontre un problème lors de l'obtention de l'exemple de code affiché dans les docs python pour la journalisation DatagramHandler, le code ci-dessous donne des exceptions EOFError sur chaque datagramme reçu.Gestionnaire de datagramme de journalisation Python

import socket 
import logging 
import cPickle 
import struct 
import sys 

sock = socket.socket (socket.AF_INET, socket.SOCK_DGRAM) 
sock.bind (('localhost', 9000)) 

handler = logging.StreamHandler() 
handler.setFormatter(logging.Formatter("UDP LogViewer %(asctime)s %(message)s")) 
logger = logging.getLogger("Test") 
logger.addHandler(handler) 

try: 
    while True: 
     dgram_size = sock.recv(4) 
     if len(dgram_size) < 4: 
      break 
     slen = struct.unpack(">L", dgram_size)[0] 
     data = sock.recv(slen) 

     while len(data) < slen: 
      data = data + sock.recv(slen - len(data)) 

     try: 
      obj = cPickle.loads(data) 
      record = logging.makeLogRecord(obj) 
      logger.handle(record) 
     except: 
      print "exception", sys.exc_info()[0] 



finally: 
    sock.close() 

Toutefois, ce code fonctionne, toutes les idées

data, address = sock.recvfrom(8192) 
rec = logging.makeLogRecord(cPickle.loads(data[4:])) 
logger.handle(rec) 

Cordialement

Répondre

3

J'attends vos premiers recv(4) copies d'appel les quatre premiers octets sur votre datagrammes et jette le reste du paquet sur le plancher; votre deuxième appel à recv ne trouve alors rien à lire et renvoie EOFError. De mon système de manpage udp(7):

All receive operations return only one packet. When the packet 
    is smaller than the passed buffer, only that much data is 
    returned; when it is bigger, the packet is truncated and the 
    MSG_TRUNC flag is set. MSG_WAITALL is not supported. 

lecture Essayez dans l'ensemble datagrammes, saisissant la longueur des quatre premiers octets, et ensuite travailler sur le sous-ensemble du tableau qui stocke l'ensemble datagrammes.

Bien sûr, si vos pickles ne rentrent pas entièrement dans le MTU de la connexion, cela ne fonctionnera probablement jamais comme vous le souhaitez.

+0

Merci sarnold, je vais donner un tourbillon – mikip

+0

Cheers sarnold, très apprécié – mikip

Questions connexes