我试着用python来理解ctypes,并且我能够让一些简单的事情正常工作,但是当谈到解包c结构时,我发现自己遇到了一些困难。我决定,要了解这一点,我应该稍微了解一下,虽然我知道socket标准库实现gethostbyname_ex()
,但我想我会尝试使用ctypes
和{
我能够相当容易地执行libc.gethostbyname()
:
#!/usr/bin/env python
from ctypes import *
cdll.LoadLibrary('libc.so.6')
libc = CDLL('libc.so.6')
he = libc.gethostbyname("www.google.com")
但这给了我一个hostent
数据结构。我认为最好的解压方法是获取c结构并创建一个继承自ctypes.Structure
的类,因此我想出了这个方法(我在netdb.h
中找到了hostent
结构定义):
我不清楚的地方是我是否正确地设置了h_aliases
和h_addr_list
字段,因为每当我试图以数组的形式访问它们时,即使在查找至少有一个别名和至少一个地址的内容后的第0个索引处,我都会得到一个空指针访问ValueError
异常:
>>> he = hostent(libc.gethostbyname("www.google.com"))
>>> pprint.pprint(he.h_addr_list)
<__main__.LP_c_char_p object at 0xb75dae84>
>>> print he.h_addr_list[0]
Traceback (most recent call last):
File "/tmp/py2659JxK", line 24, in <module>
print he.h_addr_list[0]
ValueError: NULL pointer access
欢迎提出任何建议。在
您需要定义
^{1}$gethostbyname
的返回类型是什么:另外,
h_addr_list
不应声明为POINTER(c_char_p)
,因为c_char_p
用于以空结尾的字符串。在这种情况下,POINTER(POINTER(c_ubyte))
会更好,如果是IPv4地址,那么第一个地址将是he.h_addr_list[0][:4]
。在相关问题 更多 >
编程相关推荐