2010-12-09 8 views
2

Ich habe ein Problem, den Beispielcode in den Python-Dokumenten für die Protokollierung DatagramHandler, der unten gezeigte Code zeigt EOFError Ausnahmen auf jedem empfangenen Datagramm erhalten.Python Protokollierung Datagramm Handler

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() 

jedoch dieser Code funktioniert, irgendwelche Ideen

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

Grüße

Antwort

3

Ich erwarte, dass Sie Ihre erste recv(4) Anruf kopiert die ersten vier Bytes aus Ihrem Datagramm und wirft dann den Rest des Pakets auf der Boden; Ihr zweiter Aufruf an recv findet dann nichts zu lesen und gibt EOFError zurück. Aus meinem udp(7) manpage des Systems:

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. 

Versuche Lesung im gesamten Datagramm, um die Länge aus dem ersten vier Bytes greifen, und dann arbeitet an der Teilmenge des Arrays, die das gesamte Datagramm speichert.

Natürlich, wenn Ihre Gurken nicht vollständig innerhalb der MTU der Verbindung passen, wird es wahrscheinlich nie funktionieren, wie Sie beabsichtigen.

+0

Danke sarnold, ich gebe das einen Wirbel – mikip

+0

Prost sarnold, sehr geschätzt – mikip