如何使用 Python 3.10 编写 ipv6 服务器脚本

How to write an ipv6 server script using Python 3.10

提问人:com_Last 提问时间:7/10/2023 最后编辑:Klaus D.com_Last 更新时间:7/10/2023 访问量:94

问:

  • 我的英语不是很好,所以我用了机器翻译。如果我冒犯了你,请原谅我*

我想使用 IPv4 使外部设备能够访问我的项目,但由于网关问题,我无法将端口映射到广域网。

所以我尝试使用ipv6

根据在线消息来源,从 Python 版本 3.8 开始,您可以使用该命令将项目映射到 ipv6 地址python - m http. server -- bind::

但是它报告了一个错误,在尝试了很多方法之后,我仍然无法成功。如何实现对外部设备的访问?

OSError: \[Errno 98\] Address already in use

for res in \_socket.getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: \[Errno -2\] Name or service not known

这是我的环境配置

  • 蟒蛇3.10
  • 蟒蛇3
python 服务器 ipv6 ipv4

评论

1赞 Klaus D. 7/10/2023
看起来像是语法问题。您应该发布您输入的真实命令(最好不要额外的空格)。
0赞 JunYoung Gwak 7/10/2023
看起来您系统的 IPV6 网络一开始就没有正确配置。这似乎不是你的 python 代码的问题。

答:

0赞 com_Last 7/10/2023 #1

我已经找到了解决问题的方法

第一种方法

创建新的 .py 文件

import http.server
import socket


class HTTPServerV6(http.server.HTTPServer):
    address_family = socket.AF_INET6


Handler = http.server.SimpleHTTPRequestHandler
server = HTTPServerV6(('::', 8000), Handler)
server.serve_forever()

然后运行它

第二种方法

直接命令行执行

python -m http.server --bind :: 5050

我想这可能是因为 http.server 的 IPV6 模式没有默认端口号。如果直接运行它

python -m http.server --bind :: 

错误报告如下

Traceback (most recent call last):
  File "**/anaconda3/lib/python3.9/runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "**/anaconda3/lib/python3.9/runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "**/anaconda3/lib/python3.9/http/server.py", line 1291, in <module>
    test(
  File "**/anaconda3/lib/python3.9/http/server.py", line 1240, in test
    ServerClass.address_family, addr = _get_best_family(bind, port)
  File "**/anaconda3/lib/python3.9/http/server.py", line 1223, in _get_best_family
    infos = socket.getaddrinfo(
  File "**/anaconda3/lib/python3.9/socket.py", line 954, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known

这次我用的是Python 3.9

无论如何,谢谢大家的帮助

这是我第一次使用 StackOverflow,我不是很熟练。I would would to say '蟹蟹各位了'