C UDP Socket, Fehler bei sendto() [Invalid argument]



  • Hallo!

    Erst mal bin ich unsicher, ob ich in dieses Forum posten soll, da ich aber kein eigenes C Forum gefunden habe und C++ ja soviel ich weiß komplett "abwärts kompatibel" ist, werde ich einfach mal hier fragen.

    Also ich habe seit langem nichts mehr in C programmiert und finde gerade zurück, da ich für ein privates Projekt UDP Sender und Empfänger coden muss. Ich habe mir das BEEJ Tutorial durchgelesen und dann auch was geschrieben. Der UDP Empfänger scheint zu laufen, jedenfalls schmeißt er keine Fehler. Der Sender macht mir aber noch Probleme.

    Das Problem: sendto() wirft den Fehler Invalid argument. Dass die Argumente aber zumindest vom Typ her richtig sind vermute ich einfach mal, da der Compiler mir nichts gegenteiliges mitteilt.

    Ich weiß jetzt leider nicht weiter und hoffe einfach mal, dass mir hier jemand helfen kann.

    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <arpa/inet.h>
    #include <errno.h>
    
    int main(int argc, char *argv[]){
            struct addrinfo aiHints, *aiResults;
            int fdSocket;
            int returnValue;
            char szBuff[1024];
    
            snprintf(szBuff, 20, "TESTMSG\0");
    
            memset(&aiHints, 0, sizeof aiHints);
    
            aiHints.ai_family = AF_UNSPEC;
            aiHints.ai_socktype = SOCK_DGRAM;
            aiHints.ai_flags = AI_PASSIVE;
    
    //        getaddrinfo("fe80::21b:77ff:fe80:bb97", "16782", &aiHints, &aiResults);
            getaddrinfo(NULL, "16782", &aiHints, &aiResults);
    
            fdSocket = socket(aiResults->ai_family, aiResults->ai_socktype, aiResults->ai_protocol);
            if(fdSocket == -1) perror("ERROR: socket(): ");
            printf("socket() returned: %d\n", fdSocket);
            returnValue = sendto(fdSocket, (const char*)szBuff, strlen(szBuff),0, (struct sockaddr*)aiResults, sizeof (struct sockaddr));
            printf("sendto() returned: %d\n", returnValue);
            perror("sendto() ERROR: ");
    
            return 0;
    }
    

    Das ist die Source von meinem Sender. Für jede Hilfe bin ich dankbar.

    MfG
    s-thet

    EDIT: Danke für den Hinweis mit dem Ansi C Forum, muss wohl meinen Parser mal umschreiben 😉 In das Webzeugs gehört der Thread aber nicht glaub ich, da es hier ja nicht um eine "webbasierte sprache" handelt. Naja die Moderatoren werden mir hoffentlch vergeben und den Thread verschieben, Sorry nochmal.



  • s-thet schrieb:

    da ich aber kein eigenes C Forum gefunden habe

    Schau nochmal nach, das Forum nennt sich "ANSI C". Und für Netzwerkgeschichten gibts noch das "Webzeugs" Forum...



  • Probiers mal mit AF_INET anstelle von AF_UNSPEC.
    Simon



  • habe ich schon probiert, da sagte er mir das würde vom protokoll nicht unterstützt. anscheinend ist der standard bei lenny (debian 5.0) ipv6, das habe ich jedenfalls daraus geschlossen, dass er mit AF_INET (ipv4) nicht klarkam.

    EDIT: Lösung gefunden!

    1 #include <stdio.h>
      2 #include <string.h>
      3 #include <sys/types.h>
      4 #include <sys/socket.h>
      5 #include <netdb.h>
      6 #include <arpa/inet.h>
      7 #include <errno.h>
      8 
      9 int main(int argc, char *argv[]){
     10         struct addrinfo aiHints, *aiResults;
     11         int fdSocket;
     12         int returnValue;
     13         char szBuff[1024];
     14 
     15         struct sockaddr_in *helpme;
     16 
     17         snprintf(szBuff, 20, "TESTMSG\0");
     18 
     19         memset(&aiHints, 0, sizeof aiHints);
     20 
     21         aiHints.ai_family = AF_INET;
     22         aiHints.ai_socktype = SOCK_DGRAM;
     23         aiHints.ai_flags = AI_PASSIVE;
     24         aiHints.ai_protocol = IPPROTO_UDP;
     25 
     26 //      getaddrinfo("fe81::21b:77ff:fe80:bb97", "16782", &aiHints, &aiResults);
     27         returnValue = getaddrinfo(NULL, "16782", &aiHints, &aiResults);
     28         if(returnValue != 0)
     29                 printf("getaddr() ERROR: %s\n", gai_strerror(returnValue));
     30         fdSocket = socket(aiResults->ai_family, aiResults->ai_socktype, aiResults->ai_protocol);
     31         if(fdSocket == -1) 
     32                 perror("ERROR: socket(): ");
     33         sendto(fdSocket, (const char*)szBuff, strlen(szBuff),0, aiResults->ai_addr, aiResults->ai_addrlen);
     34         freeaddrinfo(aiResults);
     35 
     36         return 0;
     37 }
    

    der hinweis mit der family auf AF_INET setzen war gar nicht verkehrt, scheint aber nur in zusammenhang mit spezifizierung des protokolls wirklich zu funktionieren.

    danke allen die geholfen haben, kann dann geschlossen werden.


Anmelden zum Antworten