正确关闭UDP连接扭曲pysnmp

时间:2017-03-17 09:30:34

标签: python twisted pysnmp

我使用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吗?

2 个答案:

答案 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