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?
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 –
@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. –
Danke, ich würde versuchen, es zu beheben –