gpt4 book ai didi

python - 如何在 Python 中使用套接字响应 SSDP 搜索?

转载 作者:可可西里 更新时间:2023-11-01 16:32:06 26 4
gpt4 key购买 nike

我正在尝试创建一个类似 Chromecast 的设备,可以从互联网流式传输视频并进行远程控制。我使用 HTTP get 请求对设备进行远程控制,并使用以下代码监听它们:

监听对设备的 HTTP 请求(本地主机):

import socket
import sys

s = socket.socket()
host = "localhost"
port = 8060
s.bind(('', port))
s.listen(1)
try:
while True:
connection, clientAddress = s.accept()
try:
print clientAddress
//Do Command
//Reply
except:
print "Error"
except KeyboardInterrupt:
print('interrupt')

然后我开始实现 SSDP,以便其他设备可以找到我的设备并转换到它,并计划使用类似的代码来监听 MSEARCH 请求,但 239.255.255.250:1900 除外。但是,当发送 MSEARCH 时,代码不会接收它。

监听“239.255.255.250:1900”上的 SSDP 搜索

import socket
import sys

s = socket.socket()
host = "239.255.255.250"
port = 1900
s.bind((host, port))
s.listen(10)
try:
while True:
connection, clientAddress = s.accept()
try:
print("Trigger")
print clientAddress
data = connection.recv(1048)
print data
except:
print "Error"
except KeyboardInterrupt:
print('interrupt')

问题:

所以问题是为什么两者的行为不同(我相信这是因为在第一个示例中,设备监听也是 HTTP 请求的目的地,而在第二个示例中则不是) 和有什么方法可以修复代码以便我可以监听 SSDP 搜索。

最佳答案

SSDP 是一个 UDP 协议(protocol),但您没有在套接字构造函数中指定 UDP。通过使用不带参数的套接字构造函数,

s = socket.socket()

你得到默认参数:

socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

如您所见,类型的默认值是 SOCK_STREAM,即 TCP。相反,请查看 this example 中的 server() 方法,其中一个片段是:

MCAST_GRP = '239.255.255.250'
MCAST_PORT = 1900

def server(timeout=5):

socket.setdefaulttimeout(timeout)

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
sock.bind(('', MCAST_PORT))

mreq = struct.pack('4sl', socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
# ... more code at the link

关于python - 如何在 Python 中使用套接字响应 SSDP 搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45840395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com