Python 2.7 在所有网络接口上发送m-search数据包

Python 2.7 在所有网络接口上发送m-search数据包,python-2.7,twisted,assertion,reactor,ssdp,Python 2.7,Twisted,Assertion,Reactor,Ssdp,我正在实现一个代码,通过该代码,我必须将设备连接到我机器上的所有网络接口 为此,我首先获取所有网络接口的ip,然后在它们上发送m-search命令 2.5秒后,停止端口以侦听 但它给了我一些断言错误 code: class Base(DatagramProtocol): """ Class to send M-SEARCH message to devices in network and receive datagram packets from them ""

我正在实现一个代码,通过该代码,我必须将设备连接到我机器上的所有网络接口

为此,我首先获取所有网络接口的ip,然后在它们上发送m-search命令

2.5秒后,停止端口以侦听

但它给了我一些断言错误

code:

class Base(DatagramProtocol):
    """ Class to send M-SEARCH message to devices in network and receive datagram
        packets from them
    """
    SSDP_ADDR = "239.255.255.250"
    SSDP_PORT = 1900
    MS = "M-SEARCH * HTTP/1.1\r\nHOST: {}:{}\r\nMAN: 'ssdp:discover'\r\nMX: 2\r\nST: ssdp:all\r\n\r\n".format(SSDP_ADDR, SSDP_PORT)

def sendMsearch(self):
    """ Sending M-SEARCH message
    """
    ports = []
    for address in self.addresses:
        ports.append(reactor.listenUDP(0, self, interface=address))

    for port in ports:
        for num in range(4):
            port.write(Base.MS, (Base.SSDP_ADDR,Base.SSDP_PORT))
        reactor.callLater(2.5, self.stopMsearch, port) # MX + a wait margin


def stopMsearch(self, port):
    """ Stop listening on port
    """
    port.stopListening()
错误:

Traceback (most recent call last):
  File "work\find_devices.py", line 56, in sendMsearch
    ports.append(reactor.listenUDP(0, self, interface=address))
  File "C:\Python27\lib\site-packages\twisted\internet\posixbase.py", line 374, in listenUDP
    p.startListening()
  File "C:\Python27\lib\site-packages\twisted\internet\udp.py", line 172, in startListening
    self._connectToProtocol()
  File "C:\Python27\lib\site-packages\twisted\internet\udp.py", line 210, in _connectToProtocol
    self.protocol.makeConnection(self)
  File "C:\Python27\lib\site-packages\twisted\internet\protocol.py", line 709, in makeConnection
    assert self.transport == None
AssertionError
请说明此代码中的错误以及如何更正此错误


同样在linux机器上,如果在网络上找不到设备,则不会转到stopMsearch()为什么?

协议只能有一个传输。循环:

for address in self.addresses:
    ports.append(reactor.listenUDP(0, self, interface=address))
尝试创建多个UDP传输,并将它们全部与
self
-单个协议实例关联

这就是断言错误告诉您的。协议的传输必须是
None
(即,它不能有传输)。但是在循环的第二次迭代中,它已经有了一个传输


尝试改用多个协议实例。

我建议打印出传递到
reactor.listenUDP的
接口
参数的地址,看看这是否提供了线索。我还对尝试在端口0上侦听感到困惑,你测试过吗?@Mikletz我已经检查了地址,它们是正确的,如果我对它们单独发送m-search,它们工作正常。问题是当我试图同时对所有代码段发送m-search时,我想不出任何明显的问题,因为有多少代码段是未知的(我怀疑大多数读者也会有相同的响应-在您的示例中有大量细节没有解决)。在这个问题上考虑记录调试实验(比如地址检查之类的东西,包括简化的工作和非工作的可运行代码)。请通过示例帮助我们更好地了解您的代码/问题的范围,我们将能够提供更高质量的反馈/答案。@JeanPaul您是说要修改这样的代码-
def sendmserchtoall(self):for address in self.addresses:self.sendMsearch(address)def sendMsearch(self,address):port=reactor.listenUDP(0,self,interface=address)表示范围(4)内的num:port.write(Base.MS,(Base.SSDP\u ADDR,Base.SSDP\u port))reactor.callLater(2.5,self.stopMsearch,port)#MX+a wait margin
,这很难读取。但不,我认为这不对。我仍然只看到了
Base
的一个实例(我想,还是很难读取)@JeanPaul是的,我仍然使用了一个Base实例,这是错误的。但是现在我用每个接口的单独的Base实例实现了代码,它成功了。谢谢Jean-Paul@JeanPaul在linux机器上,如果在网络上找不到任何设备,则它不会调用stopMsearch()为什么?如何调试?你的问题中没有设备查找代码。我不确定你在说什么。也许你想提出一个新问题。