C-字节数组到结构(dns查询)

C-字节数组到结构(dns查询),c,dns,bytearray,structure,C,Dns,Bytearray,Structure,我有以下结构: typedef struct dnsQuery { char header[12]; struct TdnsQuerySection *querySection; } TdnsQuery; typedef struct dnsQuerySection { unsigned char *name; struct TdnsQueryQuestion *question; } TdnsQuerySection; typedef struct dnsQueryQues

我有以下结构:

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查询问题和类型。

您的查询部分打印机类型不完整。您需要预先对其进行typedef,并且不使用structure关键字,或者使用结构名称而不是typedef。e、 g:

typedef struct foo Foo;

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

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

您的查询部分打印机类型不完整。您需要预先对其进行typedef,并且不使用structure关键字,或者使用结构名称而不是typedef。e、 g:

typedef struct foo Foo;

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

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

谢谢,这很有帮助,你能再帮我一次吗?现在,当我尝试打印时,我得到了seg故障11。问题出在哪里?我认为您的结构没有正确映射到您正在转换的数据上。如果取消引用的指针无效(可能为null或类似),则看起来像一个。在取消引用之前,请尝试打印每个指针,或使用调试器检查它们的值。此外,您可能还记得
foo*bar
foo bar[]
不是一回事。第一个是指向某个内存的指针,第二个是一块内存,其中包含多个相邻的
foo
类型。谢谢,我知道其中的区别。我尝试过并且
dnsQuery->querySection
不为空,但是当我尝试访问querySection中的变量时,我得到了seg错误。querySection中的
unsigned char*name
可能存在一些问题,但如何解决?它有变量lenght。指针不等于NULL并不意味着指针是有效的。NULL只是保证无效。如果您是从文件、缓冲区或其他地方获取数据,那么您需要编写一个结构来模拟缓冲区中的数据表示。例如,由十个字符组成的列表后跟一些结构的列表可能是
struct bar{char name[10];struct baz[];}
。在不了解基础数据的情况下,我真的帮不了你。谢谢,这很有帮助,你能帮我一次吗?现在,当我尝试打印时,我得到了seg故障11。问题出在哪里?我认为您的结构没有正确映射到您正在转换的数据上。如果取消引用的指针无效(可能为null或类似),则看起来像一个。在取消引用之前,请尝试打印每个指针,或使用调试器检查它们的值。此外,您可能还记得
foo*bar
foo bar[]
不是一回事。第一个是指向某个内存的指针,第二个是一块内存,其中包含多个相邻的
foo
类型。谢谢,我知道其中的区别。我尝试过并且
dnsQuery->querySection
不为空,但是当我尝试访问querySection中的变量时,我得到了seg错误。querySection中的
unsigned char*name
可能存在一些问题,但如何解决?它有变量lenght。指针不等于NULL并不意味着指针是有效的。NULL只是保证无效。如果您是从文件、缓冲区或其他地方获取数据,那么您需要编写一个结构来模拟缓冲区中的数据表示。例如,由十个字符组成的列表后跟一些结构的列表可能是
struct bar{char name[10];struct baz[];}
。在不了解底层数据的情况下,我无法真正提供帮助。通过
recvfrom
接收的dns查询不包含指针值,因此您无法将其直接映射到问题中显示的结构。您需要修改结构定义,使其不包含指针,或者需要解析接收到的数据,并逐个字段填充结构。通过
recvfrom
接收的dns查询不包含指针值,因此无法将其直接映射到问题中显示的结构。您需要修改结构定义,使其不包含指针,或者需要解析接收到的数据,并逐个字段填充结构。