首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解码ctype结构

解码ctype结构
EN

Stack Overflow用户
提问于 2011-06-12 23:32:10
回答 1查看 1.8K关注 0票数 3

我正在尝试理解python中的ctype,并且我能够让一些简单的东西工作,但是当涉及到解压c结构时,我发现自己遇到了一些困难。我决定,为了学习这一点,我应该尝试一下,虽然我知道套接字标准库实现了gethostbyname_ex(),但我想我应该尝试使用ctypeslibc.gethostbyname()实现它。

我能够相当容易地执行libc.gethostbyname()

代码语言:javascript
复制
#!/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结构定义):

代码语言:javascript
复制
class hostent(Structure):
    '''
    struct hostent
    {
      char *h_name;                 /* Official name of host.  */
      char **h_aliases;             /* Alias list.  */
      int h_addrtype;               /* Host address type.  */
      int h_length;                 /* Length of address.  */
      char **h_addr_list;           /* List of addresses from name server. */
    }
    '''
    _fields_ = [("h_name", c_char_p), ("h_aliases", POINTER(c_char_p)),
                ("h_addrtype", c_int), ("h_length", c_int),
                ("h_addr_list", POINTER(c_char_p))]

我不清楚的是我是否正确地设置了h_aliasesh_addr_list字段,因为每当我试图将它们作为数组访问时,即使在查找我知道的至少有一个别名和至少一个地址的东西之后,在第0个索引处,我都会得到一个空指针访问ValueError异常:

代码语言:javascript
复制
>>> 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

任何建议都将受到欢迎。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-12 23:52:23

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

代码语言:javascript
复制
>>> libc.gethostbyname.restype = POINTER(hostent)
>>> he = libc.gethostbyname("www.google.com")[0]
>>> he.h_aliases[0]
'www.google.com'

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6322781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档