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


Log in to reply