Char-Array über Netzwerk senden



  • Hallo Leute,
    habe ein kleines Problem.
    Ich habe begonnen mich mit der Netzwerkprogrammierung zu beschäftigen, und versuche ein char-Array zu übertragen

    char nachricht[] = "hallo";
    for(int i = 0; i<sizeof(nachricht);i++)
    {
       write (client , &nachricht[i] , sizeof (nachricht[i]));
    }
    

    Die Ausgabe beim Client erfolgt folgendermaßen:

    if(read(sd, &variable, sizeof(variable))<0)
    {
        printf("read() failed: %s\n", strerror(errno));
        close(sd);
        exit(EXIT_FAILURE);
    }
    printf("%s", &variable);
    

    Aber seltsamerweise ist alles was ankommt
    "hall" und ein komisches Zeichen.

    Danke im Vorraus



  • Wie ist "variable" im zweiten Codestück definiert?



  • mcemsi schrieb:

    char nachricht[] = "hallo";
    for(int i = 0; i<sizeof(nachricht);i++)
    {
       write (client , &nachricht[i] , sizeof (nachricht[i]));
    }
    

    Wenn du das Schreiben in so kleine Stücke zerhackst, kannst du auf der anderen Seite möglicherweise schon etwas lesen, bevor du mit dem Schreiben fertig bist, du müsstest dann also noch mindestens ein zweites read aufrufen.

    read liefert dir die Anzahl der gelesen Bytes. Das solltest du prüfen.



  • Danke vielmals!,
    genau da lag das Problem.

    Nun habe ich es so gelöst, dass ich als erstes einen integer mit der anzahl der Zeichen übermittle, und anschließend in einer Schleife alle Buchstaben einzeln lese. Das kommt mir jedoch nicht wie eine sinnvolle Methode vor, Strings zu übertragen.
    Außerdem habe ich das Problem, dass bei jedem Zeichen noch irgendein Sonderzeichen o.Ä. mitgesendet wird, welches die Konsole als Kästchen darstellt.

    if(read(sd, &sizeOfMsg, sizeof(sizeOfMsg))<0)
        {
            printf("read() failed1: %s\n", strerror(errno));
            close(sd);
            exit(EXIT_FAILURE);
        }
        printf("%d",sizeOfMsg);
        int i = 0;
        for(i;i<sizeOfMsg;i++)
        {
            if(read(sd, &message, sizeof(message))<0)
            {
                printf("read() failed2: %s\n", strerror(errno));
                close(sd);
                exit(EXIT_FAILURE);
            }
            printf("%s", &message);
        }
    


  • Ich habe im Zusammenhang mit Netzwerkprogrammierung immer die Funktionen send und recv genutzt. Die Übertragung eines Arrays ist damit definitiv keine Kunst.

    // Senden
    char buf[64];
    sprintf(buf, "Hello, World!");
    send(sock, buf, strlen(buf), 0);
    
    // Empfangen
    char buf[64];
    int rc = recv(sock, buf, sizeof(buf) - 1, 0); // - 1 für Terminierungszeichen
    buf[rc] = '\0'; // Nullterminierung
    
    printf("'%s'\n", buf);
    

    Vermutlich funktioniert write aber eh ähnlich. Habe damit aber noch nie gearbeitet.



  • hm, dankesehr mit recv funktioniert es einwandfrei (:



  • mcemsi schrieb:

    hm, dankesehr mit recv funktioniert es einwandfrei (:

    recv funktioniert nicht anders als read! Wenn es jetzt funktioniert, dann weil du auch den anderen fehlerhaften Code geändert hast.


Anmelden zum Antworten