我使用pysnmp制作扭曲的应用程序以发送snmp陷阱。执行sendNotification后,UDP连接没有关闭,并且在一段时间后应用程序停止工作。
在重新启动应用程序后查看日志文件我可以看到连接正在关闭。所以我需要在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 :(得分:0)
用户数据报协议或 UDP 是无状态/无连接协议,无需关闭。你只需发送它,希望数据最终到达目的地,然后忘掉它。
有关UDP的详细信息,请参阅Wikipedia article。
答案 1 :(得分:0)
最好的办法是在SnmpEngine
次来电之间保留sendtrap
个实例。原因是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