TCP Datenaustausch in Abhängigkeit der Eingabe des Nutzers



  • Ich hab einen Client und einen Server, bei denen soweit alles funktioniert

    Aber ich wollte, dass der Server in Abhängigkeit der Eingaben des Clients jeweils verschiedene Nachrichten zurück schickt.

    Der Client hat z.B: 3 verschiedene Auswahlmöglichkeiten.

    In den Buffer wird ja ein Char-Array eingelesen. Wenn der Server also vom Client eine 1 bekommt, soll er einen bestimmten Text zurücksenden.

    Der Datenaustauschteil sieht jetzt so aus: (Wenn der Benutzer in der Konsole eine Eingabe macht, schickt der Server ne Antwort)

    // Daten austauschen
      while(rc!=SOCKET_ERROR)
      {
        rc=recv(connectedSocket,buf,256,0);
        if(rc==0)
        {
          printf("Server hat die Verbindung getrennt..\n");
          break;
        }
        if(rc==SOCKET_ERROR)
        {
          printf("Fehler: recv, fehler code: %d\n",WSAGetLastError());
          break;
        }
        buf[rc]='\0';
        printf("Client sendet: %s\n",buf);
        sprintf(buf2,"bestätigt %s",buf);
        rc=send(connectedSocket,buf2,strlen(buf2),0);
      }
      closesocket(acceptSocket);
      closesocket(connectedSocket);
      WSACleanup();
    

    Wie könnte eine solche Funktion aussehen? Vielleicht hat ja jemand nen Tipp für mich. Ich komme grad echt nicht weiter. 😕



  • also eigentlich 2 möglichkeiten, strcmp() oder eine lookup-table

    evtl. mal ein kleines beispiel mit strcmp

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int send(int fp,char *str,int len,int flags){
    	fwrite(str,1,len,stdout);
    	return 1;
    }
    
    int main(void) {
    	int rc;
    	int connectedSocket;
    	char *input="command b";
    
    	if(0);
    	else if(strcmp(input,"command a")==0)
    		rc=send(connectedSocket,"command a\n",strlen("command a\n"),0);
    	else if(strcmp(input,"command b")==0)
    		rc=send(connectedSocket,"command b\n",strlen("command b\n"),0);
    	else if(strcmp(input,"command c")==0)
    		rc=send(connectedSocket,"command c\n",strlen("command c\n"),0);
    
    	return 0;
    }
    

    oder schöner mit lookup-table das heißt die ersten 8bit bestimmen die ausgeführte aktion und der rest der message sind parameter o.ä.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void actionA(int sockfd,char *msg,int len){
    	printf("recv %s",msg);
    	//bsp.
    	//send(sockfd,msg,len,0);
    }
    
    int main(void) {
    	int rc;
    	int connectedSocket;
    	char *input="command b";
    	//lookup table für das erste byte
    	void (*response[0xFF+1])(int sockfd,char *msg,int len)={};
    	//registrieren des callbacks für 'c'
    	response[(unsigned char)'c'] = actionA;
    	response[(unsigned char)input[0]](connectedSocket,input+1,strlen(input+1));
    }
    

    ach ja ein switch / case wär auch noch möglich da sollte aber das prinzip klar sein oder? 😉

    lg lolo



  • In Zeile 17 wird festgelegt, was der Server zurücksendet.
    Die kannst du ersetzen mit zum Beispiel sowas:

    if (!strcmp(buf, "version")) sprintf(buf2, "Meine Version ist 0.1");
    else if (!strcmp(buf, "hallo")) sprintf(buf2, "selber hallo");
    else if (!memcmp(buf, "reverse ", 8)){
        int arraylen = strlen(buf + 8);
        for (int i = 0; i < arraylen; i++)
            buf2[i] = buf[arraylen - 1 - i];
    }
    else sprintf(buf2, "unbekanntes Kommando");
    

    Das kannst du natürlich in eine Funktion schreiben, wäre wahrscheinlich auch sinnvoll.

    createResponse(const char *input, const char *output, bufferlength);
    Zeile 17: createResponse(buf, buf2, sizeof buf2);
    

    Edit: Die Forenuhr geht vor.

    Edit2: Meine Uhr ging nach -.-



  • nwp2 schrieb:

    Edit: Die Forenuhr geht vor.

    😃

    ich geb mal ne runde *kaffee* aus, hätt ja nicht gedacht das hier um die uhrzeit der bär steppt 😮



  • erst ma danke für die schnellen antworten. ich werd gleich mal ein paar sachen probieren. 😃



  • du kannst auch einfache ne getarnte struct übergeben und auf der anderen seite auslesen:)



  • nwp2 schrieb:

    ...
    else if (!memcmp(buf, "reverse ", 8)){
    ...
    

    denke du dachtest eher an sowas 😉

    ...
    else if (strlen(buf) > 7 && memcmp(buf, "reverse ", 8)==0){
    ...
    


  • noobLolo schrieb:

    denke du dachtest eher an sowas 😉

    ...
    else if (strlen(buf) > 7 && memcmp(buf, "reverse ", 8)==0){
    ...
    

    Wieso das denn?
    buf ist länger als 8 Zeichen (>=256), sonst geht das alles sowieso nicht.
    So paranoid dass ich sinnlose Absicherungen mache bin ich noch nicht. Aber ein bisschen nachbearbeitet werden sollte es noch:

    const char reverse[] = "reverse ";
    if ...
    ...
    else if (!memcmp(buf, reverse, sizeof reverse - 1)){
    	int arraylen = strlen(buf) - sizeof reverse + 1;
    	for (int i = 0; i < arraylen; i++)
    		buf2[i] = buf[sizeof reverse - 1 + i];
    }
    

    Vielleicht sollte man auch ein const int reverseLength = sizeof reverse - 1; definieren.



  • nwp2 schrieb:

    noobLolo schrieb:

    denke du dachtest eher an sowas 😉

    ...
    else if (strlen(buf) > 7 && memcmp(buf, "reverse ", 8)==0){
    ...
    

    Wieso das denn?
    buf ist länger als 8 Zeichen (>=256), sonst geht das alles sowieso nicht.

    Der dritte Parameter gibt die Anzahl der zu lesenden Bytes an. Ist dies mehr, als vorhanden sind, so kehrt recv mit weniger als len Bytes zurück

    ...
    else if (rc > 7 && memcmp(buf, "reverse ", 8)==0){
    ...
    


  • Ich verstehe trotzdem nicht wozu du auf strlen(buf) > 7 testen willst.



  • nwp2 schrieb:

    Ich verstehe trotzdem nicht wozu du auf strlen(buf) > 7 testen willst.

    ja ok strlen(buf)>7 ist nicht die super idee

    aber

    else if (rc > 7 && memcmp(buf, "reverse ", 8)==0){
    

    mußt du zugeben ist schon nicht so schlecht 😃



  • Habs jetzt mit strcmp gemacht. Funktioniert bestens 🙂 Danke nochmal.
    So ein int i in der For-Schleife funktioniert übrigens im normalen c nich. Keine Ahnung wieso, aber da meckert der Compiler.

    lg



  • Ratsuchender schrieb:

    So ein int i in der For-Schleife funktioniert übrigens im normalen c nich. Keine Ahnung wieso, aber da meckert der Compiler.

    das geht ab C99
    🙂


Anmelden zum Antworten