2017-03-17 95 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你能详细说明什么是不工作? –