重複の可能性:
C - 構造体へのバイト配列 (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;
buf
そして、からのバイト配列に DNS クエリがありますrecvfrom
。次のようにバイト配列から構造を取得しようとしています:
TdnsQuery* dnsQuery = (TdnsQuery*)buf;
次のようにqtypeにアクセスしようとしたとき:
printf("%u", dnsQuery->querySection->question.qtype);
seg fault 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);