2010-11-19 18 views
1

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

+1

* on * rname'e ihtiyacınız yok –

+0

NULL değeri alıyorum. Ayrıca, memcümeyi kullanarak memcümeyi() kullandığımı, ancak yine de aynı sonucu kullanmayı denedim. –

cevap

2

sorun ağ üzerinden veri ayrıştırmak için C yapılarını kullanmaya çalışıyorsanız olmasıdır. Makineniz büyük bir endiansa ve derleyiciniz sipariş vermesini istediğiniz şekilde bitfields siparişi veriyorsa, bu durum tamamdır (işaretçi alanlarına gelene kadar ...), ama çok kırılgandır. Paketleri unsigned char dizisi olarak ayırmalısınız.

Şimdi, şuna bak:

struct QUESTION{ 
    char* qname; 
    struct REQ_DATA field; 
}; 

Bu 8 veya 16 bayt olan bir yapıdır (sizin platforma bağlı olarak) gerçek DNS paketine değişken uzunlukta sahası gibi, hiçbir şey. Şüphesiz, ağdaki verilerin dışında geçerli bir işaretçiyi (kendi makinenizin ve işleminizin adres alanının yerel olması için) elde etmenin hiçbir yolu yoktur.

İlgili konular