UDP-Paket via Rawsocket:Invalid Arguments
-
Möchte gerne via Raw-sockets ein Datenpaket verschicken, aber ich kriege beim sendto jedesmal ein "invalid arguments" fehler. ich verstehe leider nicht ganz woher dieser kommt. zumal alle code-schnipsel die ich so im interent finde es eigentlich genauso handhaben wie ich.
sieht wer was falsch ist ?
#define __USE_BSD /* use bsd'ish ip header */ #include <sys/socket.h> /* these headers are for a Linux system, but */ #include <netinet/ip.h> #include <netinet/udp.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> unsigned short in_cksum(unsigned short *ptr, int nbytes) { register long sum =0; u_short oddbyte = 0; while(nbytes > 1) { sum += *ptr++; nbytes -=2; } if(nbytes == 1) { *((u_char *) &oddbyte) = *(u_char*) ptr; sum += oddbyte; } sum = (sum>>16) + (sum & 0xffff); sum += (sum>>16); return (u_short)~sum; } int main(int argc, char **argv) { /* Aktuelle Nutzer Root bzw. Rootrechte vorhanden */ int uid = geteuid(); if ( uid != 0) { printf("Benoetigt Root-Rechte! Aktuelle ID: %i", uid); exit(1); } unsigned int headersize = sizeof(struct ip) + sizeof(struct udphdr); unsigned int payload = 4096; unsigned int packetsize = headersize + payload; unsigned char packet[packetsize]; memset(packet,0,packetsize); struct ip *iph = (struct ip*) packet; struct udphdr *udp = (struct udphdr *) packet + sizeof(struct ip); int rawsock=0; if ((rawsock = socket(AF_INET, SOCK_RAW, IPPROTO_UDP)) < 0) { perror("Socketerzeugung ist in die Hose gegangen!"); exit(1); } /* Eigenen IP-Header verwenden, Kernel-Header unterdrücken */ int on=1; if (setsockopt(rawsock, IPPROTO_IP, IP_HDRINCL, (const char* )&on, sizeof(on)) < 0 ) { perror("IP_HDRINCL fehlgeschlagen!\n"); exit(1); } struct sockaddr_in sin; memset(&sin, 0, sizeof(struct sockaddr_in)); sin.sin_addr.s_addr = inet_addr("127.0.0.1"); sin.sin_port = htons(1235); sin.sin_family = AF_INET; /* 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 = 100; iph->ip_sum = 0; //Berechnung erfolgt weiter unten iph->ip_p = IPPROTO_UDP; iph->ip_src.s_addr = inet_addr("192.168.2.103"); iph->ip_dst.s_addr = inet_addr("127.0.0.1"); iph->ip_id = htons(random()); /* UDP Header zusammenbauen */ udp->uh_sport = htons(1234); udp->uh_dport = htons(1235); udp->uh_ulen = htons(packetsize - sizeof(struct ip)); udp->uh_sum = 0; //printf("Checksumme berechnen, Headersize \n"); //iph->ip_sum = in_cksum((unsigned short*) &iph, sizeof(struct ip)); //printf("Errechnete Checksumme: %i\n", iph->ip_sum); printf("Versenden\n"); if (sendto(rawsock, packet, packetsize, 0, (struct sockaddr*) &sin, sizeof(struct sockaddr_in)) < 0 ) perror("Da is was Fehlgeschlagen"); close(rawsock); return 0; }
Sitze jetzt schon ziemmlich lange daran und komme eifnach nicht dahinter was ich da falsch befülle oder woher der fehler kommt.
Danke für Hilfe.
Gruß
-
sieht keiner was? ich blick einfach nicht durch was falsch ist
-
Hi,
das einzige, das mir auffällt, ist dass er beim Buffer eigentlich nen void pointer haben will, also *packet.
Aber da sollte der Compiler eigentlich energisch darauf hin weisen...