IP-Header zusammenbauen



  • hi,

    ich arbeite mit raw-sockets und möchte mir dafür u.a. ein ip-header zusammenbauen.

    /* IP Header zusammenbauen */
     iph->ip_v 		       	= 4; //IPv4
     iph->ip_hl		    	= 5;
     iph->ip_tos           	= 0x0;
     iph->ip_len		  	= htons(packetsize); /* Groesse das Paketes */
     iph->ip_ttl        	= 255;
     iph->ip_sum	 		= 0; /* Checksum automatische Berechnung durch Kernel */
     iph->ip_p		 		= IPPROTO_UDP;
     iph->ip_src 			= inet_addr("127.0.0.1"); //ERROR
     iph->ip_dst 			= inet_addr("127.0.0.1"); //ERROR
     iph->ip_id 			= htons(random());
    

    wenn ich jetzt kompiliere krieg ich die Fehlermeldung: "incompatible types in assignment" (für die src und dst ip). Wenn ich mir jetzt eines der zahllosen Beispiel anschaue wird die Zuweisung einer ip-Adresse aber eig. immer über den Aufruf inet_addr gemacht.

    Hab jetzt mal in den header reingeschaut wo der ip-header definier ist. Dort ist die ziel/quell Adresse als struct inet definiert - das müsste doch eigentlich dann passen oder nicht ?

    Versteh nich ganz was ich da falsch mache, kann mir wer helfen ?



  • Sag mal, was ist "iph" denn für ein struct?

    Naja, auf jeden Fall nutzt du inet_addr() falsch. Wenn du einen string (const char*) übergibst, musst du den Namen des Rechners übergeben. 127.0.0.1 ist das Loopback als IP Adresse (im Normalfall), und nicht der Name! inet_addr() gibt dir ein in_addr_t struct zurück...



  • Tobias W schrieb:

    Naja, auf jeden Fall nutzt du inet_addr() falsch. Wenn du einen string (const char*) übergibst, musst du den Namen des Rechners übergeben. 127.0.0.1 ist das Loopback als IP Adresse (im Normalfall), und nicht der Name!

    Quark, inet_addr wandelt die IP-Adresse in Dot-Notation in eine 4-Byte Struktur um. Namensauflösung macht inet_addr garnicht.

    @OP: Dann schau doch wenigstens mal nach welches der Zieltyp ist.



  • Ach wie blöd bin ich denn. Ich hab von gethostbyname() geredet, weiß nicht warum ich das verwechselt habe...



  • definiert ist die strukur im platform sdk so:

    /*
     * Structure of an internet header, naked of options.
     */
    struct ip {
    #ifdef _IP_VHL
    	u_char	ip_vhl;			/* version << 4 | header length >> 2 */
    #else
    #if BYTE_ORDER == LITTLE_ENDIAN
    	u_int	ip_hl:4,		/* header length */
    		ip_v:4;			/* version */
    #endif
    #if BYTE_ORDER == BIG_ENDIAN
    	u_int	ip_v:4,			/* version */
    		ip_hl:4;		/* header length */
    #endif
    #endif /* not _IP_VHL */
    	u_char	ip_tos;			/* type of service */
    	u_short	ip_len;			/* total length */
    	u_short	ip_id;			/* identification */
    	u_short	ip_off;			/* fragment offset field */
    #define	IP_RF 0x8000			/* reserved fragment flag */
    #define	IP_DF 0x4000			/* dont fragment flag */
    #define	IP_MF 0x2000			/* more fragments flag */
    #define	IP_OFFMASK 0x1fff		/* mask for fragmenting bits */
    	u_char	ip_ttl;			/* time to live */
    	u_char	ip_p;			/* protocol */
    	u_short	ip_sum;			/* checksum */
    	struct	in_addr ip_src,ip_dst;	/* source and dest address */
    };
    

    im programm verwende ich die dann so:

    unsigned char packet[packetsize];
    
     struct ip *iph = (struct ip*) packet;
    

    Aber prinzipell ist das korrekt wie ich inet_addr verwende ?



  • keiner ne idee? ich versteh nicht warum er das nicht frisst 😞



  • iph->ip_src.s_addr = inet_addr("...");
    

Anmelden zum Antworten