if-else im Server oder switch ??



  • Hi Leute,
    neues Problem :

    Ich habe jetzt nen Client und nen Server mit Hilfe von WinSock gebastelt.
    Und wenn ich als Client was eingebe, antwortet der Server auch richtig dem Client. Ich will aber nun, dass wenn man im Client "shutdown" schreibt, der Server antworten soll: "PC wird heruntergefahren" und wenn man "abmelden" drückt, dann soll der User sich abmelden. Aber ich habe schon mit if-else versucht einzubauen, aber funzt net recht
    Kann mir jemand helfen ? am besten mit switch, da der server mehrere anweisungen (1,2,3,4,5,usw..) bearbeiten muss.
    Hier die Codes:

    server.cpp

    Code:

    /*Server: läuft über WinSock. 
    Wartet auf Verbindung mit Client, antwortet mit Ausgabe*/ 
    
    #include <windows.h> 
    #include <winsock.h> 
    #include <stdio.h> 
    #include <iostream> 
    
    using namespace std; 
    
    //Prototypen 
    int startWinsock(); 
    void Shutdown(); 
    void Neustart(); 
    
    int main() 
    { 
      long rc; 
        char bWort[256]; 
        char bWort2[300]; 
      SOCKET acceptSocket; 
      SOCKET connectedSocket; 
      SOCKADDR_IN addr; 
    
      // Winsock starten 
      rc=startWinsock(); 
    
      //Prüfen, ob es Fehler bei startWinsock() gibt 
      if(rc!=0) 
      { 
        printf("Fehler: startWinsock, fehler code: %d\n",rc); 
        return 1; 
       closesocket(acceptSocket); 
      } 
      else 
      { 
        printf("Winsock gestartet!\n"); 
      } 
    
      // Socket erstellen 
      acceptSocket=socket(AF_INET,SOCK_STREAM,0); 
    
      if(acceptSocket==INVALID_SOCKET) 
      { 
        printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); 
        return 1; 
       closesocket(acceptSocket); 
      } 
      else 
      { 
        printf("Socket erstellt!\n"); 
      } 
    memset(&addr,0,sizeof(SOCKADDR_IN)); //alles wird auf 0 gesetzt 
    addr.sin_family=AF_INET; //Internet 
    addr.sin_port=htons(1111); //Port 1111 wird geöffnet 
    addr.sin_addr.s_addr=INADDR_ANY; // Wartet auf Ips, egal welche 
    
    //Prüfen, ob bind funktioniert 
    rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); 
    
    if(rc==SOCKET_ERROR) 
    { 
      printf("Fehler: bind, fehler code: %d\n",WSAGetLastError()); 
      return 1; 
      closesocket(acceptSocket); 
    } 
    else 
    { 
      printf("Socket an port 1111 gebunden\n"); 
    } 
    
    //Prüfen, ob listen funktioniert 
    rc=listen(acceptSocket,10); 
    
    if(rc==SOCKET_ERROR) 
    { 
      printf("Fehler: listen, fehler code: %d\n",WSAGetLastError()); 
      return 1; 
      closesocket(acceptSocket); 
    } 
    else 
    { 
      printf("acceptSocket ist im listen Modus....\n"); 
    } 
    
    //Prüfen, ob Verbindung akzeptiert wird mit Hilfe von accept() 
    connectedSocket=accept(acceptSocket,NULL,NULL); 
    
    if(connectedSocket==INVALID_SOCKET) 
    { 
      printf("Fehler: accept, fehler code: %d\n",WSAGetLastError()); 
      return 1; 
     closesocket(acceptSocket); 
    } 
    else 
    { 
      printf("Neue Verbindung wurde akzeptiert!\n"); 
    } 
    
       // Daten austauschen 
      while(rc!=SOCKET_ERROR) 
      { 
        rc=recv(connectedSocket,bWort,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; 
        } 
        bWort[rc]='\0'; 
       printf("Client sendet: %s\n",bWort); 
        sprintf(bWort2,"Du hast geschrieben %s",bWort); 
        rc=send(connectedSocket,bWort2,strlen(bWort2),0); 
        } 
    
      closesocket(acceptSocket); 
      closesocket(connectedSocket); 
      WSACleanup(); 
      return 0; 
    } 
    
    int startWinsock(void) 
    { 
      WSADATA wsa; 
      return WSAStartup(MAKEWORD(2,0),&wsa); 
    }
    

    Den Code des Clients braucht ihr net, da es über den Server laufen soll.
    Bitte HELP
    Könnt ihr mir den Quellcode so bearbeiten, dass, wenn man im CLient zB s eintippt, der Server antwortet: Rechner wird neugestartet!



  • nein ??



  • Hört sich schwer nach
    www.c-worker.ch an also nix selber gebastelt.
    Bei recv empfängst du doch die Daten-> Also den Buffer Auswerten

    if(Buff[0]==s)
    {
         send(s,"Computer urnterfahren",..,..);
        oder so...
    }
    


  • genau, aber sonst gibts dort keine hilfe 🙂
    Ich werds mal so versuchen...



  • Hallo,

    du koenntest dir eine std::map<std::string, std::string> deklarieren mit
    std::map<befehl_moeglichkeiten_client, antwort_moeglichkeiten_server>.

    Bekommst du einen Befehl vom Client, kannst du so schauen, ob er in der
    map ist und entsprechend senden:

    if(myMap.count(clientBefehl))
        send(s, myMap[clientBefehl].c_str(), ...);
    

    mfg
    v R



  • ja, danke. so ca. hab ich es auch, nur mit strings 😉
    und funzt auch 🙂


Anmelden zum Antworten