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

プロトコルは、トランスポートを 1 つだけ持つことができます。ループ:

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

複数の UDP トランスポートを作成し、それらすべてをself単一のプロトコル インスタンスに関連付けようとします。

これは、アサーション エラーが伝えていることです。プロトコルのトランスポートはNone、そうでなければなりません (つまり、トランスポートを持ってはなりません)。しかし、ループの 2 回目の反復では、既にトランスポートがあります。

代わりに、複数のプロトコル インスタンスを使用してみてください。

于 2014-06-14T14:25:21.820 に答える