【发布时间】:2014-06-12 07:17:26
【问题描述】:
我正在实现一个代码,通过它我必须让设备连接到我机器上的所有网络接口。
为此,我首先获取所有网络接口的 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() 为什么?
【问题讨论】:
-
我建议打印出正在传递给
reactor.listenUDP的interface参数的地址,看看这是否提供了线索。我也对尝试监听 0 端口感到困惑,你测试过吗? -
@MikeLutz 我检查了地址,它们是正确的,如果我在它们上单独发送 m-search,它们工作正常。问题是当我试图同时向所有这些发送 m-search 时。
-
鉴于您的代码 sn-ps,我想不出任何明显的问题,因为有多少是未知的(我怀疑大多数读者也会有相同的反应 - 有大量的细节是没有在您的示例中解决)。考虑在这个问题中记录您的调试实验(即地址检查之类的东西,并包括简化的工作和非工作可运行代码)。通过示例帮助我们更好地了解您的代码/问题的范围,我们将能够提供更高质量的反馈/答案。
标签: python-2.7 twisted assertion reactor ssdp