python-3.x - SSDP M-search不适用于单播-单个IP

标签 python-3.x sockets ssdp

SSDP M搜索发现请求非常适合多播地址239.255.255.250。但是,我有一个要求将此请求发送到特定IP。这没用。根据UPnP architecture document支持单播发现消息,与多播消息有微小差异

多播消息是M-SEARCH * HTTP/1.1 HOST:239.255.255.250:1900 MAN:ssdp:discover ST:ssdp:all MX:1
单播消息类似-除了将多播IP更改为特定IP并删除MX:1(根据规范-找不到用于单播发现m-search的任何代码示例)

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32)
msg = 'M-SEARCH * HTTP/1.1\r\nHOST:239.255.255.250:1900\r\nMAN:\"ssdp:discover\"\r\nST:ssdp:all\r\nMX:1\r\n\r\n'
s.sendto(msg.encode('utf-8'), ('239.255.255.250', 1900))
resp = s.recv(1024)
print (resp)

这很好用。但是以下不是-recv()调用超时

sock_1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
msg = 'M-SEARCH * HTTP/1.1\r\nHOST:<specific ip>:1900\r\nMAN:\"ssdp:discover\"\r\nST:ssdp:all\r\n\r\n'
sock_1.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32)
sock_1.settimeout(30)
sock_1.sendto(msg.encode('utf-8'), ('<specific ip>', 1900))
resp = sock_1.recv(1024)

我尝试了更多的'setsockopt'变体,但没有奏效。
如果有任何可能的线索,请分享-可能是从设备端响应1900年的多播,而不是单播消息?

提前致谢!

最佳答案

msg = 'M-SEARCH * HTTP/1.1\r\nHOST:<specific ip>:1900\r\nMAN:\"ssdp:discover\"\r\nST:ssdp:all\r\n'

您最后缺少最后一个\r\n(用于 header 结尾的空行:没有它,接收方将继续等待更多)。

关于python-3.x - SSDP M-search不适用于单播-单个IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57724950/

相关文章:

python - pandas 将日期时间列转换为时间戳

python - 如何获取 groupby 总计,然后计算 Pandas DataFrame 列的百分比

c++ - Socket select() 第二次阻塞

c# - UPnP 组播 : missing answers from M-SEARCH (Discovery)

SSDP协议(protocol)-实现

cordova - 查找连接到同一网络的设备的 IP 地址和端口

python - 如果超过特定数量的 NA 值,则删除一列

python - 通过比较 pandas 中的一列或多列进行 bool 切片

java - Android Client 和 PC Server 使用套接字通信

c++ - 如何检测之前连接的 SSL/TCP 套接字上的互联网断开连接?