2017-06-15 3 views
0

Ich bin nicht sehr erfahren in C-Programmierung, aber ich habe versucht, Paketdaten mit C zu erfassen und zu analysieren, aber ich habe ein Problem, dass ich die Daten nicht an die Variablen innerhalb übergeben kann der Stuck. Es sind meine structs:Übergabe von Daten an die Struktur von iphdr

struct ipOut { 
    unsigned int ipVer; 
    unsigned int headerDWORDS; 
    unsigned int headerBytes; 
    unsigned int typeOfService; 
    unsigned int ipLength; 
    unsigned int ident; 
    unsigned int ttl; 
    unsigned int protocolNum; 
    unsigned int checkSum; 
    }; 
struct ipAddr{ 
    char srcIP[16]; 
    char destIP[16]; 
}; 
struct hexOut{ 
    unsigned char * hexBuff; 
}; 
struct sockaddr_in src, dest; 

Ich habe aus der Steckdose Daten habe arbeiten und schickte Puffer iphdr:

void ipHeaderOutput(unsigned char * buff, int data) { 
    packetNum++; 
    struct iphdr *iph = (struct iphdr*)buff; 
    memset(&src, 0, sizeof(src)); 
    memset(&dest, 0, sizeof(dest)); 
    src.sin_addr.s_addr = iph->saddr; 
    dest.sin_addr.s_addr = iph->daddr; 

    struct ipOut ipHeader[packetNum]; 
    ipHeader[packetNum].ipVer = iph->version; 
    ipHeader[packetNum].headerDWORDS = (unsigned int)iph->ihl; 
    ipHeader[packetNum].headerBytes = (unsigned int)iph->ihl*4; 
    ipHeader[packetNum].typeOfService = (unsigned int)iph->tos; 
    ipHeader[packetNum].ipLength = ntohs(iph->tot_len); 
    ipHeader[packetNum].ident = ntohs(iph->id); 
    ipHeader[packetNum].ttl = (unsigned int)iph->ttl; 
    ipHeader[packetNum].protocolNum = (unsigned int)iph->protocol; 
    ipHeader[packetNum].checkSum = ntohs(iph->check); 

    struct ipAddr ipAddr[packetNum]; 
    strcpy(ipAddr[packetNum].srcIP, inet_ntoa(src.sin_addr)); 
    strcpy(ipAddr[packetNum].destIP, inet_ntoa(dest.sin_addr)); 
} 

Die ipAddr Struktur werden Daten immer perfekt, ohne jedes Problem. Allerdings sind die Daten nicht das gleiche Problem mit der ipOut Struktur bei all.Also passieren Ich habe, während die Daten aus dem Puffer in hexOut struct vorbei:

void hexDataOut(unsigned char * buff, int data){ 
    hexNum++; 

    struct hexOut h[hexNum]; 
    h[hexNum].hexBuff = (unsigned char *)malloc(65536); 
    memcpy(h[hexNum].hexBuff, buff, 65536); 
    h[hexNum].hexBuff = buff; 
} 

Auch ist es der richtige Weg, dynamische Struktur Tag zu erstellen?

Antwort

2

Lets an diesen beiden Linien einen genaueren Blick:

struct ipOut ipHeader[packetNum]; 
ipHeader[packetNum].ipVer = iph->version; 

erste Person einen lokalen variable ipHeader definiert, die eine Reihe von Elementen packetNum ist.

Die zweite Zeile verwendet die außerhalb der Grenzen Index Zugriff auf ein Element im Array.

Zuerst, warum deklarieren Sie ipHeader als Array? Zweitens, warum definieren Sie es als eine lokale Variable? Drittens führt das Verlassen der Grenzen zu undefined Verhalten, die Ihr ganzes Programm schlecht gebildet und ungültig macht.

Gleiches später mit der ipAddr Variable.

+0

1. Ich habe es als Array definiert, weil ich eine neue Variable für jedes Paket wollte (zum Beispiel ipHeader1, ipHeader2 und so weiter). 2. Yeap, ich bin Idiot, ich sollte es korrigieren 3. Ich würde über undefined Verhalten lesen, danke –

+0

@MatthewDarens Wenn Sie möchten, dass die Arrays zwischen Aufrufen überleben, dann können sie nicht als lokale Variablen definiert werden. Verwenden Sie stattdessen entweder globale Variablen oder übergeben Sie sie als Zeiger an die Funktion. Und wenn Sie nicht möchten, dass die Arrays zur Kompilierungszeit eine feste Größe haben, müssen Sie die dynamische [Zuweisung] (http://en.cppreference.com/w/c/memory/malloc) und [Neuzuweisung] recherchieren. (http://en.cppreference.com/w/c/memory/malloc). Beachten Sie schließlich, dass Array-Indizes * null * -basiert sind, so dass ein Array von "N" -Elementen Indizes von "0" bis "N-1" (einschließlich) aufweist. –

+0

Danke, ich würde versuchen, es zu beheben –

Verwandte Themen