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:
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
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