2017-03-17 157 views
0

我使扭曲的應用程序使用pysnmp發送snmp陷阱。執行sendNotification後,一段時間的應用程序停止工作後,UDP連接未關閉。正確關閉UDP連接扭曲pysnmp

重新啓動應用程序後查看日誌文件我可以看到連接正在關閉。所以我需要在sendtrap()之後添加這個。

日誌:

2017-03-17 09:57:30+0100 [UdpTwistedTransport (UDP)] Stopping protocol <pysnmp.carrier.twisted.dgram.udp.UdpTwistedTransport instance at 0x7fc76365fab8> 
2017-03-17 09:57:30+0100 [UdpTwistedTransport (UDP)] (UDP Port 56465 Closed) 

sendtrap()骨架

from pysnmp.hlapi.twisted import * 

@defer.inlineCallbacks 
def sendtrap(data): 
    connection = UdpTransportTarget((TRAP_DESTINATION, 1620)) 

    d = yield sendNotification(
     SnmpEngine(), 
     CommunityData('public'), 
     connection, 
     ContextData(), 
     'trap', 
     NotificationType(
      ObjectIdentity('1.1.1.') 
     ).addVarBinds() 
    ) 

    # connection.protoTransport.closeTransport() 

我發現的唯一的一點是連接實例connection.protoTransport.closeTransport(),但此調用不會對UDP收盤影響。

你知道如何關閉UDP嗎?

回答

0

用戶數據報協議或UDP,是一種無狀態/無連接協議,不需要關閉。你只是發送它,希望數據結束在目的地,並忘記它。

有關UDP的更多信息,請參閱Wikipedia article

+0

我明白了,但在這種情況下,我得到了pysnmp.smi.error.MibLoadError:MIB文件/opt/sendtrap/lib/python2.7/site-packages/pysnmp/smi/mibs/SNMPv2-MIB.pyc訪問錯誤:[Errno 24]打開的文件過多:以及之後2017-03-16 10:29:39 + 0100重新啓動應用程序[UdpTwistedTransport(UDP)]停止協議 2017-03-16 10:29 :39 + 0100 [UdpTwistedTransport(UDP)](UDP端口27714關閉) – alex

0

最好的辦法是在sendtrap調用中保留SnmpEngine實例。原因在於SNMP引擎內部複雜且成本昂貴。這裏是an example

如果您仍然希望從從頭重新初始化SNMP引擎,那麼我建議你明確地關閉它一旦你調用完成:

from pysnmp.hlapi.twisted import * 
from pysnmp.hlapi.twisted import lcd 

def sendtrap(data): 

    snmpEngine = SnmpEngine() 

    yield sendNotification(
     snmpEngine, 
     CommunityData('public'), 
     UdpTransportTarget((TRAP_DESTINATION, 1620)), 
     ContextData(), 
     'trap', 
     NotificationType(ObjectIdentity('1.1.1.')) 
    ) 

    # this will undo all notification-specific changes to SnmpEngine 
    lcd.unconfigure(snmpEngine) 


# calling Twisted reactor 
+0

Hello Ilya, 不幸的是,從pysnmp.hlapi.twisted導入液晶顯示器已被棄用,並把邏輯推到protoTransport到closeTransport()這是不工作 – alex

+0

@alex你能詳細說明什麼是不工作? –