HTTPSConnection 无法绑定特定的 ipv6 源地址 python3
HTTPSConnection fails binding specific ipv6 source address python3
我正在尝试用我的 ipv4 和 ipv6 地址更新 freedns.afraid.org 内容,同时将请求与相应接口的 ip 绑定; ipv4可以,ipv6不行。
遵循 ipv6 错误代码片段(ipv4 是 simmetric):
...
conn = http.client.HTTPSConnection("freedns.afraid.org", timeout=10,source_address=(ipv6,0))
req = ("/dynamic/update.php?blablabla&address=%s" % ipv6)
conn.request("GET", req, headers=headers)
...
conn.request returns:
Traceback (most recent call last):
File "./test2.py", line 39, in <module>
conn.request("GET", req, headers=headers)
File "/usr/lib64/python3.4/http/client.py", line 1137, in request
self._send_request(method, url, body, headers)
File "/usr/lib64/python3.4/http/client.py", line 1182, in _send_request
self.endheaders(body)
File "/usr/lib64/python3.4/http/client.py", line 1133, in endheaders
self._send_output(message_body)
File "/usr/lib64/python3.4/http/client.py", line 963, in _send_output
self.send(msg)
File "/usr/lib64/python3.4/http/client.py", line 898, in send
self.connect()
File "/usr/lib64/python3.4/http/client.py", line 1279, in connect
super().connect()
File "/usr/lib64/python3.4/http/client.py", line 871, in connect
self.timeout, self.source_address)
File "/usr/lib64/python3.4/socket.py", line 516, in create_connection
raise err
File "/usr/lib64/python3.4/socket.py", line 506, in create_connection
sock.bind(source_address)
socket.gaierror: [Errno -9] Address family for hostname not supported
ipv6 可以:
ping6 -n afraid.org
PING afraid.org(2604:8b80:2:8::2) 56 data bytes
64 bytes from 2604:8b80:2:8::2: icmp_seq=1 ttl=45 time=173 ms
您只能将本地地址设置为与远程相同的地址族。为了能够使用 IPv6 本地地址,这需要远程地址也可以作为 IPv6 。
不幸的是,这里不是这种情况; freedns.afraid.org
:
没有 IPv6 DNS 条目
$ host -t AAAA freedns.afraid.org
freedns.afraid.org has no AAAA record
请注意 freedns.afraid.org
与 afraid.org
不是同一个地址;后者确实有一个 IPv6 地址,这就是您能够 ping 通它的原因:
$ host -t AAAA afraid.org
afraid.org has IPv6 address 2604:8b80:2:8::2
我正在尝试用我的 ipv4 和 ipv6 地址更新 freedns.afraid.org 内容,同时将请求与相应接口的 ip 绑定; ipv4可以,ipv6不行。 遵循 ipv6 错误代码片段(ipv4 是 simmetric):
...
conn = http.client.HTTPSConnection("freedns.afraid.org", timeout=10,source_address=(ipv6,0))
req = ("/dynamic/update.php?blablabla&address=%s" % ipv6)
conn.request("GET", req, headers=headers)
...
conn.request returns:
Traceback (most recent call last):
File "./test2.py", line 39, in <module>
conn.request("GET", req, headers=headers)
File "/usr/lib64/python3.4/http/client.py", line 1137, in request
self._send_request(method, url, body, headers)
File "/usr/lib64/python3.4/http/client.py", line 1182, in _send_request
self.endheaders(body)
File "/usr/lib64/python3.4/http/client.py", line 1133, in endheaders
self._send_output(message_body)
File "/usr/lib64/python3.4/http/client.py", line 963, in _send_output
self.send(msg)
File "/usr/lib64/python3.4/http/client.py", line 898, in send
self.connect()
File "/usr/lib64/python3.4/http/client.py", line 1279, in connect
super().connect()
File "/usr/lib64/python3.4/http/client.py", line 871, in connect
self.timeout, self.source_address)
File "/usr/lib64/python3.4/socket.py", line 516, in create_connection
raise err
File "/usr/lib64/python3.4/socket.py", line 506, in create_connection
sock.bind(source_address)
socket.gaierror: [Errno -9] Address family for hostname not supported
ipv6 可以:
ping6 -n afraid.org
PING afraid.org(2604:8b80:2:8::2) 56 data bytes
64 bytes from 2604:8b80:2:8::2: icmp_seq=1 ttl=45 time=173 ms
您只能将本地地址设置为与远程相同的地址族。为了能够使用 IPv6 本地地址,这需要远程地址也可以作为 IPv6 。
不幸的是,这里不是这种情况; freedns.afraid.org
:
$ host -t AAAA freedns.afraid.org
freedns.afraid.org has no AAAA record
请注意 freedns.afraid.org
与 afraid.org
不是同一个地址;后者确实有一个 IPv6 地址,这就是您能够 ping 通它的原因:
$ host -t AAAA afraid.org
afraid.org has IPv6 address 2604:8b80:2:8::2