DNS Yanıtını ayrıştırma konusunda sorun yaşıyorum. Aşağıda benim kodum. Aşağıdaki yapılardır. QNAME yazdırmaya çalıştığım printf() dosyasında bölümleme hatası alıyorum.Ayrıştırma DNS Yanıtı
C programlama söz konusu olduğunda oldukça amatörüm, bu yüzden nerede yanlış gittiğimden emin değilim. Herhangi bir yardım/ipucu veya faydalı kaynaklara/öğreticilere bağlantı, takdir edilecektir. Verfify_header() işlevi düzgün çalışıyor. HEADER'in neden memcpy() kullanılarak düzgün şekilde çıkarıldığından emin değilim. ve diğer alanlar değildir.
struct HEADER{
unsigned short ID;
unsigned char RD:1;
unsigned char TC:1;
unsigned char AA:1;
unsigned char Opcode:4;
unsigned char QR:1;
unsigned char RCODE:4;
unsigned char Z:3;
unsigned char RA:1;
unsigned short QDCOUNT;
unsigned short ANCOUNT;
unsigned short NSCOUNT;
unsigned short ARCOUNT;
};
struct REQ_DATA{
unsigned short qtype;
unsigned short qclass;
};
struct QUESTION{
char* qname;
struct REQ_DATA field;
};
struct RES_DATA{
unsigned short type;
unsigned short class;
unsigned int ttl;
unsigned short rdlength;
};
struct RESPONSE{
char* name;
struct RES_DATA field;
char* rdata;
};
Aşağıdaki, dns yanıtını ayrıştırma işlevidir.
void parse_response(char *recvbuf, struct result *res)
{
struct HEADER *rechd = (struct HEADER*) malloc(sizeof(struct HEADER));
struct QUESTION qst;
struct RESPONSE *rp = (struct RESPONSE*) malloc(sizeof(struct RESPONSE));
struct RES_DATA fld;
char* rname = (char*)malloc(sizeof(char));
int hlen,qlen,rlen;
hlen = sizeof(struct HEADER);
memcpy(rechd,recvbuf,hlen);
verify_header(rechd); //This function works correctly
qlen = sizeof(struct QUESTION);
//RESPONSE is after QUESTION and HEADER
rlen = sizeof(struct RESPONSE);
int length = hlen + qlen;
rp = (struct RESPONSE*)(recvbuf + length);
//memcpy(rp, recbbuf + length, sizeof(struct RESPONSE));
memcpy(rname, rp, strlen(rname) + 1);
printf("QNAME: %s\n", *rname); //Segmentation Fault occurs over here!!!!!
}
sayesinde Chander
* on * rname'e ihtiyacınız yok –
NULL değeri alıyorum. Ayrıca, memcümeyi kullanarak memcümeyi() kullandığımı, ancak yine de aynı sonucu kullanmayı denedim. –