1

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

为此,我首先获取所有网络接口的 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()

Error:

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() 为什么?

4

1 回答 1

2

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

for address in self.addresses:
    ports.append(reactor.listenUDP(0, self, interface=address))

尝试创建多个 UDP 传输并将它们全部与self- 单个协议实例相关联。

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

尝试使用多个协议实例。

于 2014-06-14T14:25:21.820 回答