Python 正确关闭UDP连接和SNMP

Python 正确关闭UDP连接和SNMP,python,twisted,pysnmp,Python,Twisted,Pysnmp,我使用pysnmp创建了twisted应用程序来发送snmp陷阱。在执行sendNotification后以及应用程序停止工作一段时间后,UDP连接不会关闭 重新启动应用程序后查看日志文件,我可以看到连接正在关闭。所以我需要在sendtrap()之后添加这个 日志: 我找到的唯一一点是连接实例连接.protoTransport.closeTransport(),但此调用不影响UDP关闭 您知道如何关闭UDP吗?用户数据报协议(UDP)是一种无状态/无连接协议,无需关闭。您只需发送它,希望数据最终

我使用pysnmp创建了twisted应用程序来发送snmp陷阱。在执行sendNotification后以及应用程序停止工作一段时间后,UDP连接不会关闭

重新启动应用程序后查看日志文件,我可以看到连接正在关闭。所以我需要在sendtrap()之后添加这个

日志:

我找到的唯一一点是连接实例连接.protoTransport.closeTransport(),但此调用不影响UDP关闭


您知道如何关闭UDP吗?

用户数据报协议(UDP)是一种无状态/无连接协议,无需关闭。您只需发送它,希望数据最终到达目的地,然后忘记它


有关UDP的更多信息,请参阅。

最好的做法是跨
sendtrap
调用保留
SnmpEngine
实例。原因是SNMP引擎在内部很复杂,设置起来也很昂贵。给你

如果您仍然希望从头开始重新初始化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

我明白了,但在本例中,我得到了pysnmp.smi.error.mibloadror: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已关闭)您好,Ilya,不幸的是,pysnmp.hlapi.twisted导入lcd已被弃用,并且将逻辑放在protoTransport to closeTransport()中,而这不是working@alex你能详细说明什么东西不起作用吗?
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()
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