Обработчик ведомого ведения Datagram Python
Вопрос
У меня возникает проблема с получением примера кода, показанного в документах Python для журнала DatagramHandler, код, показанный ниже
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)
С Уважением
Решение
Я ожидаю твоего первого recv(4)
Вызовите копии первых четырех байтов из вашей дейтаграммы, а затем бросает остальную часть пакета на пол; Ваш второй звонок recv
Тогда не находит ничего, чтобы читать и возвращает Эоферрора. Из моей системы 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.
Попробуйте прочитать во всей Datagram, захватив длину из первых четырех байтов, а затем работая над подмножеством массива, в котором хранится вся дейтаграмма.
Конечно, если ваши солены MTU Что касается связи, это, вероятно, никогда не будет работать, как вы собираетесь.
Не связан с StackOverflow