【发布时间】:2018-12-01 21:13:16
【问题描述】:
我正在尝试在 Mac OS 上通过 ctypes / libc 从 Python 调用 getaddrinfo,以查找域的 IP 地址。
调用似乎成功:没有返回错误代码,ai_addrlen 设置为 28,据我所知,这是 IPv6 地址的适当长度。但是,ai_addr 似乎是一个空指针,我不知道如何开始调试它。
如何使用libc.getaddrinfo 找到域的 IP 地址?
from ctypes import (
byref,
c_char, c_char_p, c_int, c_size_t, c_void_p,
CDLL,
POINTER,
pointer,
Structure,
)
libc = CDLL(None)
class c_addrinfo(Structure):
pass
c_addrinfo._fields_ = [
('ai_flags', c_int),
('ai_family', c_int),
('ai_socktype', c_int),
('ai_protocol', c_int),
('ai_addrlen', c_size_t),
('ai_addr', c_void_p),
('ai_canonname', c_char_p),
('ai_next', POINTER(c_addrinfo)),
]
c_addrinfo_p = POINTER(c_addrinfo)
result = c_addrinfo_p()
error = libc.getaddrinfo(
c_char_p(b'www.google.com'),
None,
None,
byref(result),
)
print(error) # 0
print(result.contents.ai_canonname) # b'\x1c\x1e
print(result.contents.ai_addrlen) # 28
print(bool(result.contents.ai_addr)) # False === null pointer
libc.freeaddrinfo(result)
【问题讨论】:
-
socket.getaddrinfo对你不起作用有什么原因吗? -
@zwol 在获取 IP 地址方面:据我所知没有。但是,我希望更加熟悉从 Python 进行系统调用,这似乎是一个合理的起点。
-
getaddrinfo 不是 C 程序员使用的术语意义上的“系统调用”。它是 C 库中更复杂的例程之一,我认为这不是从
ctypes开始的好地方。不过,这并没有使这个问题成为一个严格按照自己的条件来回答的坏问题。 -
按照自己的方式解决这个问题,当我运行这个程序时,我得到的输出是
0、None、16和True(四行)。所以我不知道为什么它不适合你。 -
@zwol Ah 明白这不是系统调用。你在什么操作系统上运行?
标签: python python-3.x ctypes libc getaddrinfo