Windows11下如何在Python中强制HTTP连接使用IPv4而非IPv6?
Windows 11连接Binance REST API报错
IPv6 not supported的优化解决方案 问题概述
在Windows 11上使用ccxt Python库连接Binance US REST API时,出现以下错误:
ccxt.base.errors.ExchangeError: binanceus {"code":-71012,"msg":"IPv6 not supported"}
该问题并非ccxt专属,推测所有HTTP连接库都会遇到(错误直接来自Binance服务器),且Linux环境下可正常运行。
复现代码
import ccxt exchange = ccxt.binanceus({'apiKey': '<your_key>', 'secret': '<your_secret>'}) print(exchange.fetch_balance())
问题根源
Windows 11默认IPv6优先级高于IPv4,通过以下命令可验证:
> netsh interface ipv6 show prefixpolicies Querying active state... Precedence Label Prefix ---------- ----- -------------------------------- 50 0 ::1/128 40 1 ::/0 35 4 ::ffff:0:0/96 30 2 2002::/16 5 5 2001::/32 3 13 fc00::/7 1 11 fec0::/10 1 12 3ffe::/16 1 3 ::/96
其中::/0(IPv6默认路由)优先级(40)高于::ffff:0:0/96(IPv4映射地址)的优先级(35),导致系统优先使用IPv6连接Binance服务器,但Binance暂不支持IPv6。
优化解决方案
无需修改系统IPv6优先级,也不依赖第三方工具库,通过自定义requests Adapter强制使用IPv4连接,实现跨平台兼容:
import ccxt import requests import socket from urllib3.util.connection import create_connection def get_ipv4_forced_session(): class ForceIPv4Adapter(requests.adapters.HTTPAdapter): def _create_connection(self, *args, **kwargs): # 强制使用IPv4协议族创建连接 kwargs['family'] = socket.AF_INET return create_connection(*args, **kwargs) session = requests.Session() # 给所有HTTPS请求挂载强制IPv4的适配器 session.mount("https://", ForceIPv4Adapter()) return session # 初始化ccxt交易所实例并传入自定义Session exchange = ccxt.binanceus({ 'apiKey': '<your_key>', 'secret': '<your_secret>', 'session': get_ipv4_forced_session() }) print(exchange.fetch_balance())
方案优势
- 无第三方依赖:无需安装
requests_toolbelt,仅依赖Python标准库和requests、ccxt本身 - 跨平台兼容:在Windows、Linux、macOS下均可正常工作
- 更健壮:无需获取本地IPv4地址,直接通过协议族强制指定IPv4,避免本地多网卡环境下的地址选择问题
内容的提问来源于stack exchange,提问作者arosca
相关产品推荐
相关产品推荐

