Python日志记录数据报处理程序
问题描述:
我在获取日志记录DatagramHandler的python文档中显示的示例代码时出现问题,下面显示的代码在接收到的每个数据报上都给出了EOFError异常。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()
但是这个代码的工作,任何想法
data, address = sock.recvfrom(8192)
rec = logging.makeLogRecord(cPickle.loads(data[4:]))
logger.handle(rec)
问候
答
我期待你的第一个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.
尝试阅读,抓住长列第4个字节,然后在存储整个数据报的数组子集工作。
当然,如果你的泡菜并不完全适合连接的MTU,它可能不会按你的意图工作。
谢谢sarnold,我会给你一个旋转 – mikip 2010-12-09 12:24:33