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("...");