u_int32_t Was ist das?



  • HiFish schrieb:

    unsigned int 	size = (int)sizeof(struct tcphdr),
    

    überprüf' mal, ob da auch die erwartete länge drin steht.

    btw: ich würde ja auf die 'struct tcphdr' ganz verzichten und stattdessen immer ein 'unsigned char array' nehmen. bei einem tcp header ist genau festgelegt, wo die einzelnen felder sind, welche länge sie haben, welche byte order usw. ein c-compiler kann zwischen die struct-members füllbytes setzen, multibyte-werte falsch herum speichern, bitfields verdrehen und ähnliche schweinereien, so dass garnix mehr passt...



  • ja da kommt 20 raus so groß wie die Struktur definiert ist aber ich werds dann ma direkt auf 20 setzen 🙂

    Edit: Ja die Struktur is ja so vordefiniert die kann ich net einfach austauschen.



  • HiFish schrieb:

    Edit: Ja die Struktur is ja so vordefiniert die kann ich net einfach austauschen.

    warum das? welch mieses programm braucht so eine struct mit endian-abhängigen bitfields? 😮



  • Der Linux Kernel.



  • Hi Fish schrieb:

    Der Linux Kernel.

    hätt' ich mir denken können 😞 😡



  • Ja kann halt schlecht das ganze THCP Protokoll da umschreiben 😉 Ist allerdings auch schon ein recht alter Kernel (2.4.21).

    So nach ein bißchen rumprobieren habe ich herausgefunden das dieser "Bug", daraus resultiert das ich den Memorybereich in ein Char Array kopiere, wenn ich ihn in ein unsigned short int kopiere gibt er die richtigen Zahlen aus, allerdings ist der short 2 Byte lang.
    Ich werds jetztmal probieren indem ich das High bzw Low Byte mittels eines Logischen Unds maskiere.



  • HiFish schrieb:

    ...das dieser "Bug", daraus resultiert das ich den Memorybereich in ein Char Array kopiere, wenn ich ihn in ein unsigned short int kopiere gibt er die richtigen Zahlen aus...

    dann nimm doch 'unsigned char'
    im tcp header sind sowieso keine signed werte.
    beispiel:

    typedef unsigned long ul;
    #define READ32(p) (((ul)*(p))<<24|((ul)*(p+1))<<16|((ul)*(p+2))<<8|((ul)*(p+3)))
    
    void hdr_reader (struct tcphdr *hdr)
    { 
       unsigned char *p = (unsigned char*)hdr;         // als unsigned char array interpretieren
    
       // ip adressen
       unsigned long source_a = *(unsigned long*)p;    // architekturabhängig
       unsigned long dest_a = *(unsigned long*)(p+4);  // architekturabhängig
       // nochmal, aber...
       unsigned long source_b = READ32(p);             // network byte order 
       unsigned long dest_b = READ32(p+4);             // network byte order
       // ^^
       // was davon richtig ist, haengt davon ab, wie die struct gefüllt wird...
    ...
    ...
    }
    


  • Irgendwie steh ich grad auf Schlauch un stell mich zu blöd an aber wie zur hölle krieg ich das short int Array nun in ne Datei? Ich probier da jetzt schon Stunden dran rum un verlier solangsam jeden Nerv.

    Das hier gibt die Bytes schön ordentlich aus Versuche mit fprintf und putc sind fehlgeschlagen. Kann ich net irgendwie mit printf den stdout in die Datei umleiten?

    unsigned char 	tmp_hdr[160];
    	for(j=0;j<160;j++)
    	{
    		printf("%d",tmp_hdr[j]);
    		if(x==8) {printf(" ");x=0;}
    		if(j==79){printf("\n");}
    		x++;
    	}
    

    Wo ich versucht habe mit fprintf den tmp_hdr auszugeben kam ein Warning

    headerreader.c:118: warning: pointer targets in passing argument 2 of 'fprintf' differ in signedness
    

    Heut morgen mit nem klaren Kopf hats geklappt hat sich also erledigt 😉



  • Wo taucht denn in diesem Ausschnitt fprintf() auf? Wenn du das anstelle von printf() verwenden willst, mußt du als ersten Parameter das Ziel-FILE* angeben (entweder ein eigenes per fopen() angelegtes Objekt oder eins der Standard-Files stdout (normale Konsolen-Ausgabe) oder stderr (Fehlerausgabe)).



  • Mit welcher Funktion kann ich den Zahlen in einen Char schreiben?

    z.b. sprintf(string, "%d", number);

    oder
    strtod()


Anmelden zum Antworten