Possible Duplicate:
C - byte array to structure (dns query)Ç - DNS查詢來構建
我有這些結構:
typedef struct dnsQuery {
char header[12];
struct dnsQuerySection *querySection;
} TdnsQuery;
typedef struct dnsQuerySection {
unsigned char *name;
struct dnsQueryQuestion *question;
} TdnsQuerySection;
typedef struct dnsQueryQuestion {
unsigned short qtype;
unsigned short qclass;
} TdnsQueryQuestion;
我有從recvfrom
字節數組buf
的DNS查詢。我想從字節數組像這樣得到的結構:
TdnsQuery* dnsQuery = (TdnsQuery*)buf;
當我試圖訪問QTYPE是這樣的:
printf("%u", dnsQuery->querySection->question.qtype);
我得到賽格故障11
誰能幫我這些結構?他們怎麼了?我試圖添加結構:
typedef struct udpPacket {
char header[8];
structr dnsQuery query;
}
並將此結構映射到字節數組,但它沒有幫助。有人可以幫助我建立這些結構嗎?他們應該如何使用UDP協議進行DNS查詢?
編輯:我的結構,現在看起來是這樣的:
typedef struct {
unsigned short qtype;
unsigned short qclass;
} dnsQueryQuestion;
typedef struct {
dnsQueryQuestion *question;
unsigned char *data[0];
} dnsQuerySection;
typedef struct {
char header[12];
dnsQuerySection querySection[0];
} dnsQuery;
typedef struct udpPacket {
char header[8];
dnsQuery query[0];
} TudpPacket;
我加解析功能:
void parse(unsigned char *data, unsigned short *qtype, unsigned short *qclass) {
int i = 0;
while (data[i]) {
int len = data[i];
i += len + 1;
}
*qtype = (unsigned short) data[i+1];
*qclass = (unsigned short) data[i+3];
return;
}
,並試圖解析:
TudpPacket udpPack = (TudpPacket)buf;
parse(udpPack.query.querySection.data, &(udpPack.query.querySection.question.qtype), &(udpPack.query.querySection.question.qclass));
printf("%u\n", udpPack.query.querySection.question.qtype);
什麼是'buf'?它從何而來?它真的指向你的結構的一個實例嗎? – Mat
Buf是來自'recvfrom'的字節數組。 –
'struct dnsQuerySection * querySection;'< - 您不會從'recvfrom'獲得有效的指針。它不分配內存,將相關數據複製到那裏並將指針存儲在結構中。如果您接收到的消息包含_pointer_值,那麼這些值對您沒有用處,因爲他們會說出原始系統上的內容。 –