Concurrent Server



  • Hallo,

    ich soll einen Concurrent Server schreiben, der den String in umgekehrter Reihenfolge zurückschreibt(Palindrom).

    Jedoch bekomme ich beim starten des Client permament eine segmentation fault.

    Habe nun einiges ausprobiert und geändert, jedoch taucht der Fehler immer noch auf. Könnt ihr mir weiterhelfen?

    Server.c

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define ever ;;
    
    #define SERV_PORT 9877
    #define LISTENQ 1024
    #define MAXLINE 4096
    
    void reverse(char *word, int length)
    {
      char *begin = word;
      char *end = word + length;
    
      for (int i = 0; i < length / 2; ++i) {
        char temp = *end;
        *end = *begin;
        *begin = temp;
    
        ++begin;
        --end;
      }
    }
    
    void handleClient(int client){
        char buf[MAXLINE];
        int len;
    
        for(ever){
            len = read(client, buf, MAXLINE);
            reverse(buf, len);
            write(client, buf, len);
        }
    }
    
    int main(void){
        int serverSocket, clientSocket;
        int clientlen;
        struct sockaddr_in servaddr, clientaddr;
        pid_t pid;
    
        serverSocket = socket(AF_INET, SOCK_STREAM, 0);
        memset(&servaddr, 0, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(SERV_PORT);
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        bind(serverSocket, (struct sockaddr*)&servaddr, sizeof(servaddr));
    
        listen(serverSocket, LISTENQ);
        for(ever){
            clientlen = sizeof(clientaddr);
            clientSocket = accept(serverSocket, (struct sockaddr*)&clientaddr, &clientlen);
            pid = fork();
            if(pid == 0){
                close(serverSocket);
                handleClient(clientSocket);
                close(clientSocket);
                exit(0);
            }
            close(clientSocket);
        }
        close(serverSocket);
    }
    
    
    
    
    

    Client.c

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <string.h>
    
    #define ever ;;
    
    #define SERV_PORT 9877
    #define MAXLINE 4096
    
    int main(int argc, char** argv){
        int serverSocket;
        struct sockaddr_in servaddr;
        char buf[MAXLINE];
        int len;
    
        serverSocket = socket(AF_INET, SOCK_STREAM, 0);
        memset(&servaddr, 0, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(SERV_PORT);
        inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
        connect(serverSocket, (struct sockaddr*)&servaddr, sizeof(servaddr));
    
        for(ever){
            memset(buf, 0, MAXLINE);
            fgets(buf, MAXLINE, stdin);
            len = strlen(buf);
            buf[len-1] = '\0';  //trim
            len--;
            write(serverSocket, buf, len);
            read(serverSocket, buf, len);
            printf("%s\n", buf);
        }
        close(serverSocket);
    }
    
    

    MfG, werdas_34



  • Jedoch bekomme ich beim starten des Client permament eine segmentation fault.

    Sollen wir den Code für dich debuggen? Stelle fest wo das passiert.

    Funktionen liefern nicht zum Spaß ein Ergebnis. Du prüfst nicht auf Fehler.



  • @manni66 sagte in Concurrent Server:

    Jedoch bekomme ich beim starten des Client permament eine segmentation fault.

    Sollen wir den Code für dich debuggen? Stelle fest wo das passiert.

    Funktionen liefern nicht zum Spaß ein Ergebnis. Du prüfst nicht auf Fehler.

    Der Fehler tritt beim Client in Zeile 24 (connect(..)).



  • @werdas_34
    Funktionen liefern nicht zum Spaß ein Ergebnis. Du prüfst nicht auf Fehler.



  • Was genau soll ich überprüfen?
    Habe int con = connect(..); gemacht und in einer if-Abfrage con auf == 0 geprüft. Keine Änderung.

    Zur Info: Es handelt sich um eine Aufgabe für die Uni. Da dürfen wir die Typüberprüfungen weglassen, da dieser Code sowieso nicht im real Alltag angewendet wird.



  • also ich hab eben mal ein bisschen probiert und beim aufruf von "client 127.0.0.1" funktionierte zumindest der verbindungsaufbau. die übertragung allerdings nur halb. edit: also NACH der beseitigung der warnungen und compilerfehler.

    aber dass der compiler da wie blöde warnungen ausspuckt, ist dir aufgefallen?



  • Zur Info: Es handelt sich um eine Aufgabe für die Uni. Da dürfen wir die Typüberprüfungen weglassen, da dieser Code sowieso nicht im real Alltag angewendet wird.

    lol
    Und du meinst also, der Compiler weiß, dass es sich bloß um eine Uni-Aufgabe handelt und behandelt deinen Code genügsam und baut alle Fehler aus?
    Im Übrigen sind alle Programmieraufgaben an Unis praxisirrelevant, genauso wie alle Aussagen von Uniprofs Unsinn sind.

    Was hat deine Frage mit Standard-C zu tun?
    Was übergibst du als argv[1]?
    Weißt du, was ein segmentation fault ist?



  • @werdas_34

    Keine Änderung.

    Du behauptest, das Programm stürzt in connect ab. Wie soll das also etwas ändern?



  • es stürzt nicht bei connect ab, sondern (wahrscheinlich bzw. bei mir) bei inet_pton, wenn nur client aufgerufen wird.



  • Funktioniert nun. Habe die Argumente falsch übergeben. Musste auch die Reverse Methode ändern. Jetzt geht aber alles.

    Danke.



  • sicher dass alles funktioniert? dass du unistd.h einbinden musstest, hast du nicht erwähnt.



  • Ich musste dies auch nicht einbinden.

    Also ich starte den Server und dann den Client. Dort gebe ich irgendeinen Text ein und er wird mir in umgekehrter Reihenfolge zurückgeliefert. Selbst wenn mehrere Clients laufen, funktioniert es.



  • naja für read und write brauchst du eigentlich unistd.h. ich habe da eine warnung bekommen.versuch doch mal einen client zu erstellen, der 1 mio verbindungen herstellen will und dann aber keine daten schickt. sozusagen als zusatzaufgabe.......


Anmelden zum Antworten