解码ctypes结构

2024-04-25 14:57:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用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结构定义):

^{pr2}$

我不清楚的地方是我是否正确地设置了h_aliasesh_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

欢迎提出任何建议。在


Tags: 方法comwwwgooglectypes结构listlibc
1条回答
网友
1楼 · 发布于 2024-04-25 14:57:25

您需要定义gethostbyname的返回类型是什么:

^{1}$

另外,h_addr_list不应声明为POINTER(c_char_p),因为c_char_p用于以空结尾的字符串。在这种情况下,POINTER(POINTER(c_ubyte))会更好,如果是IPv4地址,那么第一个地址将是he.h_addr_list[0][:4]。在

相关问题 更多 >