2014-10-01 46 views
0

我有以下的功能,即從UDP插槽讀取,並追加到一個字符串data解壓需要長度43的字符串參數 - Python的

DATA_SIZE = 2048 
def handle_read(self): 
     """ 
     This handles the incoming ntp response 
     """ 
     try: 
      data = "" 
      while 1: 
       current_data, _ = self.recvfrom(self.DATA_SIZE) 
       self.log.info("msg: %s" % current_data) 
       (header, length, typeID, param1, param2, 
       param3, param4, name_string, checksum, footer, 
       ) = struct.unpack("!2B I 4H 24s I B", current_data) 
       print (header, length, typeID, param1, param2, 
       param3, param4, name_string, checksum, footer, 
       ) 
       if not current_data: 
        break 
       data += current_data 
      self.log.info(data) 
      # parse with the pysnmp into a summary 
     except Exception, e: 
      self.log.exception("The following exception happened: %s" % e) 
     finally: 
      self.handle_close() 

當我執行的代碼我得到:

File "hello.py", line 67, in handle_read 
    ) = struct.unpack("!2B I 4H 24s I B", current_data) 
error: unpack requires a string argument of length 43 

我試着調整字符串參數的大小,但有相同的錯誤。該功能的基本功能是從self.recvfrom()中讀取並追加到data。有人可以幫忙嗎? 的self.recvfrom()的結構是在一對像:

0xpublic?kC0^0+>Linux manager 3.4.30 #1 SMP Wed Sep 3 11:31:42 UTC 2014 x86_64+C?R? 
('1.2.3.4', 161) 

這是SNMP消息我發現了從服務器返回,並且我與之通信的服務器的IP。這個想法是將SNMP MIB附加到該字符串中。

+0

數據的大小必須與您的格式說明符相匹配。它沒有。我不確定我們在這裏能夠幫到什麼。 – NPE 2014-10-01 16:45:53

+0

您可以擴展如何'self.recvfrom(self.DATA_SIZE)'的結構預計看起來像,以及如何你希望'struct.unpact'修改它之前追加到數據? – 2014-10-01 16:49:45

+0

@ user3197452我會發布樣本... – cybertextron 2014-10-01 16:53:11

回答

0

您的代碼正在讀取長達2048個字節的數據報,然後解碼前43個字節以記錄smtp信息。問題是數據報可能多於或少於43個字節。我認爲你可以通過使用unpack_from解碼消息的第一部分並簡單地拒絕那些太小的消息來解決你的問題。預編譯結構會節省一些時間,所以我也是這樣做的。

class Whatever(object): 

    DATA_SIZE = 2048 
    snmp_header = struct.Struct("!2B I 4H 24s I B") 

    def handle_read(self): 
      """ 
      This handles the incoming snmp response 
      """ 
      try: 
       data = "" 
       while 1: 
        current_data, _ = self.recvfrom(self.DATA_SIZE) 
        self.log.info("msg: %s" % current_data) 
        if len(current_data) >= self.snmp_header.size: 
         (header, length, typeID, param1, param2, 
         param3, param4, name_string, checksum, footer, 
         ) = self.snmp_header.unpack_from("!2B I 4H 24s I B", current_data) 
         print (header, length, typeID, param1, param2, 
         param3, param4, name_string, checksum, footer, 
         ) 
        else: 
         print("received datagram too small") 
        if not current_data: 
         break 
        data += current_data 
       self.log.info(data) 
       # parse with the pysnmp into a summary 
      except Exception, e: 
       self.log.exception("The following exception happened: %s" % e) 
      finally: 
       self.handle_close() 
相關問題