2010-12-09 3 views
2

У меня возникла проблема с получением кода примера, показанного в документах python для ведения журнала DatagramHandler, приведенный ниже код дает исключения EOFError для каждой полученной дейтаграммы.Python logging datagram 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() 

Однако этот код работает, любые идеи

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

С уважением

ответ

3

Я ожидаю, что ваши первые экземпляры recv(4) называем первые четыре байта из вашего дейтаграммы, а затем бросает остальную часть пакета на пол; ваш второй вызов recv затем не находит ничего для чтения и возвращает EOFError. Из 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. 

чтения Try во всей дейтаграммы, захватывая длину из первых четырех байтов, а затем работает на подмножество массива, который хранит всю дейтаграмму.

Конечно, если ваши соленые огурцы не подходят полностью в пределах MTU соединения, это, вероятно, никогда не будет работать так, как вы планируете.

+0

Спасибо, sarnold, я дам этому вихрь – mikip 2010-12-09 12:24:33