为什么在更改完成之前中断线程

2024-05-16 01:34:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建python模块,通过IP地址获取MAC地址。你知道吗

def getMACs(addressesList):
    def _processArp(pkt):
        spa = _inet_ntoa(pkt.spa) 
        if pkt.op == dpkt.arp.ARP_OP_REPLY and spa in _cache.macTable:
            lock.acquire()
            try:
                _cache.macTable[spa] = _packedToMacStr(pkt.sha)
                _cache.notFilledMacs -= 1
            finally:
                lock.release()
            if _cache.notFilledMacs == 0:
                thrd.stop()

    addresses = _parseAddresses(addressesList)

    _cache.registerCacheEntry("macTable", {})
    _cache.registerCacheEntry("notFilledMacs", 0)
    _events.arpPacket += _processArp

    lock = threading.Lock()

    thrd = _CaptureThread(promisc=False, timeout_ms=30, filter="arp")
    thrd.start()
    for addr in addresses:
        if _sendArpQuery(addr):
            _cache.macTable[str(addr)] = None
            _cache.notFilledMacs += 1
    thrd.join(125)
    thrd.stop()
    return _cache.macTable

if __name__ == "__main__":
    macTable = getMACs([IPAddress("192.168.1.1"), IPAddress("192.168.1.3")])
    _pprint.pprint(macTable)

当我运行这个模块时

{'192.168.1.1': '00:11:95:9E:25:B1', '192.168.1.3': None}

当我一步一步地调试processArp时

{'192.168.1.1': '00:11:95:9E:25:B1', '192.168.1.3': '00:21:63:78:98:8E'}

类标题为:

class CaptureThread(threading.Thread):
    def __init__ (self, name=None, snaplen=65535, promisc=True, timeout_ms=0, immediate=False, filter=None):
        threading.Thread.__init__(self)
        self.__running = True
        self.__name = name 
        self.__snaplen = snaplen 
        self.__promisc = promisc 
        self.__timeout_ms = timeout_ms 
        self.__immediate = immediate 
        self.__filter = filter 

    def stop(self):
        self.__running = False

    def run(self):
        self.__pc = pcap.pcap(self.__name, self.__snaplen, self.__promisc, self.__timeout_ms, self.__immediate)
        if self.__filter:
            self.__pc.setfilter(self.__filter)

        while self.__running:
            self.__pc.dispatch(1, self.__processPacket)

    def __processPacket(self, timestamp, pkt):
        peth = dpkt.ethernet.Ethernet(pkt)
        if isinstance(peth.data, dpkt.arp.ARP):
            _events.arpPacket(peth.data)

Tags: nameselfnonecacheifdeftimeoutfilter
1条回答
网友
1楼 · 发布于 2024-05-16 01:34:40

愚蠢的错误。因为线程同步,所以在处理线程时总是这样。你知道吗

我中断线程的条件之一是“_cache.notFilledMacs缓存== 0". 在主线程中_cache.notFilledMacs缓存在CaptRead值减小时,没有时间获取值2。你知道吗

相关问题 更多 >