2010-12-09 110 views
2

我在獲取日誌記錄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) 

問候

回答

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. 

嘗試閱讀,抓住長列第4個字節,然後在存儲整個數據報的數組子集工作。

當然,如果你的泡菜並不完全適合連接的MTU,它可能不會按你的意圖工作。

+0

謝謝sarnold,我會給你一個旋轉 – mikip 2010-12-09 12:24:33

相關問題