Fehler 10022 WSAEINVAL bei sendto()



  • Hi ...
    Ich hab ein kleines socket progg geschrieben dort will ich mit einem Raw socket..

    SOCKET create_socket(int timeout, bool RAW)
    {
    
    	// Anfangen den socket einzustellen
    	SOCKET sock; // Der socket
    	int on = 1; // Wert 1 = an
    	int st; // Der status
    
    	sock = socket(AF_INET,SOCK_RAW,IPPROTO_TCP);// Socket erstellen
    	if(sock == -1)
    	{
    		cout<<"Fehler socket konnte nicht erstellt werden......."<<endl;
    		beende();
    	}
    
    	if(RAW == true)// Raw Socket???? 
    	{
    		st = setsockopt(sock ,IPPROTO_IP ,IP_HDRINCL ,(char*)&on ,sizeof(on) );// Stellen das man selber den Ip Header schreibt
    		if(st == -1)
    			{
    			cout<<"IP_HDRINCL konnt nicht gesetzt werden setsockopt()"<<endl;
    			beende();
    			}
    	}
    
    	if(timeout != NULL) // Recvtimeout einstellen wenn der wert gesetzt ist (wer es braucht)
    	{
    		st = setsockopt(sock,SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
    		if(st == -1)
    		{
    			cout<<"SO_RCVTIMEO konnte nicht gesetzt werden setsockopt()"<<endl;
    			beende();
    		}// st
    
    	}// Timeout
    
    	// Socket Richtig eingestellt 
    	return sock; // Ihn zurück geben 
    
    }// Fertig
    

    Mit Dem will ich dann über sendto daten senden der buffer enthält den ip Header und Tcp Header aber die funktion gibt immer den fehler 10022 zurück

    int bytes_send = sendto(sock ,data ,datasize ,0 ,(SOCKADDR*)&destaddr ,sizeof(destaddr) );
    			if(bytes_send == -1)
    				beende();
    

    Jetzt weiss ich nicht woran ich arbeiten soll um den fehler weg zu bekommen 😕
    Ich hoffe ihr könnt mir helfen 🙂



  • Der Fehler 10022 ist dieser:

    WSAEINVAL (10022 )
    Invalid argument.
    Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket—for instance, calling accept on a socket that is not listening.

    Also wird wohl irgendein Argument falsch sein...



  • Ja Hab ich mir auchschon durchgelsen nur ich hab keine ahnung welches in der Definition von sendto() steht das es was mit flags zu tun hat

    An unknown flag was specified, or MSG_OOB was specified for a socket with SO_OOBINLINE enabled.

    aber ich kann nur einen flag mit der funktion mitgeben aber dort steht nicht wie ich ihn verändern sollte. Ich hab schon alles was ich gedacht habe woran das problem liegen könnt probiert deswegen frage ich ja jetzt auch hier im Forum nach.
    Aber danke für die schnelle antwort 😉 .



  • Ich glaub nich dass es am Flag (du hast ja auch keinen gesetzt) liegt.
    Evtl. ist deine sockaddr/sockaddr_in Struktur falsch ausgefüllt oder data oder datasize sind kaputt oder so...



  • Ich hab den buffer überprüft und den die SOCKADDR structur auch aber es geht immer nochnicht ich komm einfach nicht weiter 😕 😞



  • Hmm, dann weiss ich auch nich weiter 😞



  • ICh denke es könnt an den Headern Liegen also der IP Header ist von c-worker.ch 24 bytes gross

    struct IP_HEADER
    {
      unsigned int   h_len:4;          // Länge des Headers
      unsigned int   version:4;        // IP Version
      unsigned char  tos;              // Type of service
      unsigned short total_len;        // Gesamt länge des Pakets
      unsigned short ident;            // unique identifier
      unsigned short frag_and_flags;   // flags
      unsigned char  ttl;              // TTL
      unsigned char  proto;            // Protokoll (TCP, UDP etc)
      unsigned short checksum;         // IP Checksumme
      unsigned int   sourceIP;         // Source IP
      unsigned int   destIP;           // Ziel IP
    };
    

    und der TCP HEader ist von mir vieleicht liegt da drinn der fehler er ist 36 bytes eigentlich viel zu gross

    struct TCP_HEADER
    {
    	unsigned short port_from; 
    	unsigned short port_dest; 
    	unsigned int   seq_numb; 
    	unsigned int   ack_numb; 
    	unsigned int offset:4;
    	unsigned char reserviert:4;
    	bool flag1; 
    	bool flag2;  
    	bool flag3; 
    	bool flag4; 
    	bool flag5; 
    	bool flag6; 
    	unsigned short bytesrecv; 
    	unsigned short pr_summe; 
    	unsigned short urg_pointer; 
    	unsigned int options ; 
    };
    

    Ich könnte mir denken das drin der fehler liegt aber ich weiss es nicht hab ihn schon öfter verglichen vieleicht findet ja jemand fehler ...


Anmelden zum Antworten