[c; raw sockets] Problem beim Erstellen eines Packets

milchbubbi

Mitglied
Hallo Zusammen

nachdem ich mir einpaar Tutorials zu raw sockets und die Header-dateien unter Linux durchgelesen habe, versuche ich jetzt das erlangte Wissen praktisch umzusetzen, was allerdings nicht auf Anhieb klappt. Und zwar moechte ich zu Anfang einfach nur ein Packet (IP, Tcp, kein Payload) bastelln und versenden. Dafuer habe ich mir mit Hilfe der Tutorials und der Header-dateien (netinet/ip.h, tcp.h, in.h) ein kleines Programm gebastellt. Es laesst sich kompillieren und ohne Fehlermeldung ausfuehren, allerdings sieht das empfangene Packet nich so aus, wie es sollte. ZB. ist windowsize auf 0 gesetzt und die gesetzten flags auch...

Hier ist der dazugehoerende code:
Code:
#define __USE_BSD
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#define __FAVOR_BSD
#include <netinet/tcp.h>

#define DPORT 8080
#define SPORT 3441

int main (int argc, char **argv)
{
   int one = 1;
   int s = socket (AF_INET, SOCK_RAW, IPPROTO_TCP);
   char datagram[4096];
   struct ip *iph = (struct ip *)datagram;
   struct tcphdr *tcph = (struct tcphdr *)datagram + sizeof(struct ip);
   struct sockaddr_in sin;
   
   sin.sin_family = AF_INET;
   sin.sin_port = htons (DPORT);
   sin.sin_addr.s_addr = inet_addr("127.0.0.1");

   iph->ip_hl = 5;
   iph->ip_v = 4;
   iph->ip_tos = 0;
   iph->ip_len = sizeof (struct ip) + sizeof (struct tcphdr);
   iph->ip_id = rand();
   iph->ip_off = 0;
   iph->ip_ttl = 240;
   iph->ip_p = 6;     // tcp
   iph->ip_sum = 0;   // soll vom Kernel errechnet werden
   iph->ip_src.s_addr = inet_addr ("127.0.0.1");
   iph->ip_dst.s_addr = sin.sin_addr.s_addr;

   tcph->th_sport = htons (SPORT);
   tcph->th_dport = htons (DPORT);
   tcph->th_seq = rand();
   tcph->th_ack = 0;
   tcph->th_x2 = 0;
   tcph->th_off = 0;
   tcph->th_flags = TH_SYN;
   tcph->th_win = htonl (65535);
   tcph->th_sum = 0; //soll vom Kernel errechnet werden
   tcph->th_urp = 0;

   setsockopt (s, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one));
   sendto (s, datagram, iph->ip_len, 0, (struct sockaddr *) &sin, sizeof(sin));

   return 0;
}

ich hoffe, ich habe mich beim Abtippen nicht vertippt...

Vielleicht faellt ja jemandem der Fehler auf, den ich mache. Ich danke im Voraus fuer die Antworten...

Cu
 
Ich habe nie unter Linux programmiert, immer nur unter Windows, daher nur eine Frage: Wieso willst du das TCP-Paket selbst basteln, wenn du doch dafür die TCP-Services nutzen kannst?
 
Gawayn hat gesagt.:
Ich habe nie unter Linux programmiert, immer nur unter Windows, daher nur eine Frage: Wieso willst du das TCP-Paket selbst basteln, wenn du doch dafür die TCP-Services nutzen kannst?

Warum programmiert man am Anfang einen Taschenrechner in einem schnöden Konsoleninterface der auch noch nicht gut umgesetzt ist? - Um zu üben?
 
Na ja, wenn du üben willst -- ich für meinen Teil jedenfalls halte diese Form der Übung für nicht so sehr ergiebig. Es ist halt wirklich ganz extrem speziell und lässt sich nur schwer auf andere Gebiete übertragen.
 
Zurück