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,它可能不会按你的意图工作。

+0

谢谢sarnold,我会给你一个旋转 – mikip 2010-12-09 12:24:33