2012-11-18 43 views
1

我有这些结构:Ç - 字节数组结构(DNS查询)

typedef struct dnsQuery { 
    char header[12]; 
    struct TdnsQuerySection *querySection; 
} TdnsQuery; 

typedef struct dnsQuerySection { 
    unsigned char *name; 
    struct TdnsQueryQuestion *question; 
} TdnsQuerySection; 

typedef struct dnsQueryQuestion { 
    unsigned short qtype; 
    unsigned short qclass; 
} TdnsQueryQuestion; 

,我有从recvfrom在字节数组DNS查询。 我想从字节数组结构是这样的:

TdnsQuery* dnsQuery = (TdnsQuery*)buf; 
printf("%u", dnsQuery->querySection->question.qtype); 

为什么我得到错误提领指向不完全类型?我做对了吗?或者我该如何从该数组中获取dns查询结构?我需要该dns查询问题和类型。

+0

通过'recvfrom'收到的dns查询不包含指针值,所以你不能直接将它映射到你在问题中显示的结构。要么你需要修改你的结构体定义不要包含指针,要么你需要解析接收到的数据,并按字段填充结构体。 –

回答

1

您的查询部分打印机是不完整的类型。您需要事先键入def,而不要使用结构关键字或使用结构名称而不是typedef。例如:

typedef struct foo Foo; 

struct { 
    Foo* querySection; 
    // effectively same as above 
    struct foo* querySection2; 

    // NOT the following. 
    struct Foo* querySectionWrong; 
}; 
+0

谢谢,它帮助,你能再次帮助我吗?现在当我尝试printf时,我得到了seg fault 11.哪里可能出现这个问题? –

+0

我不认为你的结构映射到正确投射的数据上。看起来像一个,如果您解除引用的指针无效(可能为null或类似)。尝试在取消引用前打印每个指针,或使用调试器检查其值。 – Will

+0

另外你应该记住'foo * bar'和'foo bar []'是不一样的。第一个是指向某个内存的指针,第二个是一个包含多个类型为'foo'的内存。 – Will