Обработчик дейтаграмм для регистрации в Python - PullRequest
2 голосов
/ 09 декабря 2010

У меня проблема с получением примера кода, показанного в документации по python для ведения журнала DatagramHandler, код, показанный ниже, дает исключения EOFError для каждой полученной дейтаграммы

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)

С уважением

1 Ответ

3 голосов
/ 09 декабря 2010

Я ожидаю, что ваш первый вызов 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.

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

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

...