1

我的 python 脚本使用 getaddrinfo() 来解析地址,然后才能“绑定()”到它。

脚本片段:

def fetch_ipv6_address(addr="::1"):
    # try to detect whether IPv6 is supported at the present system and
    # fetch the IPv6 address of localhost.
    if not socket.has_ipv6:
        raise Exception("the local machine has no IPv6 support enabled")

    addrs = socket.getaddrinfo(addr, 0, socket.AF_INET6, socket.SOCK_RAW, 0x73, socket.AI_PASSIVE)
    ....
    ....

sockaddr = fetch_ipv6_address("::1")
RX = socket.socket(socket.AF_INET6, socket.SOCK_RAW, 0x73)
RX.bind(sockaddr)

该脚本在执行时会引发错误:

    # ./ip6_l2tp_ip.py
Traceback (most recent call last):
  File "./ip6_l2tp_ip.py", line 36, in <module>
    sockaddr = fetch_ipv6_address("::1")
  File "./ip6_l2tp_ip.py", line 26, in fetch_ipv6_address
    addrs = socket.getaddrinfo(addr, 0, socket.AF_INET6, socket.SOCK_RAW, 0x73, socket.AI_PASSIVE)
socket.gaierror: [Errno -8] Servname not supported for ai_socktype

关于 getaddrinfo() 参数有什么问题的任何想法?

谢谢!

4

1 回答 1

1

如果0as 2nd 参数是 long 或 int,则将其转换为字符串,以便它适合底层 API 调用支持的ai_servname字段格式。

OTOH,文档写道

o   For internet address families, if you specify servname while you set
    ai_socktype to SOCK_RAW, getaddrinfo() will raise an error, because
    service names are not defined for the internet SOCK_RAW space.

如果将其替换0None,则可以。

于 2014-04-02T07:01:09.360 回答