gpt4 book ai didi

python - 用套接字解析wss协议(protocol)的主机名?

转载 作者:行者123 更新时间:2023-11-30 23:30:29 25 4
gpt4 key购买 nike

如何通过套接字解析使用 wss 协议(protocol)的主机名?
我尝试过但失败了:

import socket<br/>
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br/>
ip = socket.gethostbyname('wss://domain.tld')

最佳答案

wss://domain.tld 不是主机名,而是 URL。您无法使用套接字解析 URL,您必须将其解析为 URL 以从中获取主机名,然后才能解析它。方案是 wss、http 还是 rsync 并不重要;任何具有 netloc 字段的方案都将以相同的方式工作。

例如,使用 urllib.parse :

>>> from urllib.parse import urlparse # in 2.x it's from urlparse
>>> url = 'wss://domain.tld'
>>> bits = urllib.parse.urlparse(url)
>>> netloc = bits.netloc
>>> netloc
'domain.tld'

那么我们就完成了,对吧?

不。 netloc 可以是主机,也可以是主机:端口。而且您不能只是 split(':'),因为 IPv6 地址中可以包含冒号,但前提是它们必须用方括号括起来。因此,要获取 netlochost 部分,您需要执行以下操作:

>>> host, _, port = netloc.rpartition(':')
>>> if ']' in port: host = netloc
>>> host
'domain.tld'

现在我们已经完成了,我们已经有了一个主机名或 IP 地址,我们可以将其传递给 socket.gethostbyname .

但有一些注意事项。

首先,您不需要创建 socket.socket 对象来调用 gethostbyname;它是模块上的顶级函数,不需要任何套接字对象。

其次,gethostbyname 不适用于 IPv6,甚至在 IPv4 上也有一些限制,因此您可能需要使用 getaddrinfo相反。

所以,完成:

>>> import socket
>>> addresses = socket.getaddrinfo(host, None) # or host, port if you prefer
gaierror: [Errno 8] nodename nor servname provided, or not known

嗯,这是可以预料的,因为我们的主机名是domain.tld,并且没有这样的域。但是,如果我们使用 www.google.com,我们会得到一个包含几十个 IPv4 地址的不错列表,如果您的系统具有 IPv6 连接,还会得到几个 IPv6 地址。您可以只使用第一个,或者更喜欢 IPv4 而不是 IPv6,反之亦然,或者在其他一些字段上进行区别对待。 (您还可以通过向 getaddrinfo 传递更多参数来首先过滤各个字段。)

关于python - 用套接字解析wss协议(protocol)的主机名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20557499/

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