server soll befehle vom client ausführen



  • So jetz bin ich im richtigen forum^^

    Hey folgendes ich hab mir einen client und einen server gebastelt mit dem code aus nem tut und nun hab ich zwei probleme 1. wie krieg ich hin das man beim client die ip des servers angibt und 2. soll zb wenn ich eine 1 sende der server den befehl unter 1 bei einem switch ausführen... beides funzt aber net

    hier mal der client

    #include <windows.h>
    #include <winsock2.h>
    #include <stdio.h>
    
    //Prototypen
    int startWinsock(void);
    char serverip[20];
    
    int main()
    {
      long rc;
      SOCKET s;
      SOCKADDR_IN addr;
      char buf[256];
      char ip;
    
      printf("Bitte Ziel-IP eingeben: ");
       scanf("%c",&ip);
       fflush(stdin);
    
      // Winsock starten
      rc=startWinsock();
      if(rc!=0)
      {
        printf("Fehler: startWinsock, fehler code: %d\n",rc);
        return 1;
      }
      else
      {
        printf("Winsock gestartet!\n");
      }
    
      // Socket erstellen
      s=socket(AF_INET,SOCK_STREAM,0);
      if(s==INVALID_SOCKET)
      {
        printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Socket erstellt!\n");
      }
    
      // Verbinden
      memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
      addr.sin_family=AF_INET;
      addr.sin_port=htons(12345); // wir verwenden mal port 12345
      addr.sin_addr.s_addr=inet_addr("127.0.0.1");
    
     /* Was muss ich nun anstatt "127.0.0.1" eingeben.. hab ja schon ne abfrage der ip am anfang mit char*/
    
      rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
      if(rc==SOCKET_ERROR)
      {
        printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Verbunden mit %c \n",ip);
      }
    
      // Daten austauschen
      while(rc!=SOCKET_ERROR)
      {
        printf("\nBitte Befehl eingeben: ");
        gets(buf);
        send(s,buf,strlen(buf),0);
        rc=recv(s,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("\nServer antwortet: %s\n",buf);
      }
      closesocket(s);
      WSACleanup();
      return 0;
    }
    
    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    

    und hier ma der server

    #include <windows.h>
    #include <winsock2.h>
    #include <stdio.h>
    
    //Prototypen
    int startWinsock(void);
    
    int main()
    {
      long rc;
      SOCKET acceptSocket;
      SOCKET connectedSocket;
      SOCKADDR_IN addr;
      char buf[256];
      char buf2[300];
    
      // Winsock starten
      rc=startWinsock();
      if(rc!=0)
      {
        printf("Fehler: startWinsock, fehler code: %d\n",rc);
        return 1;
      }
      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;
      }
      else
      {
        printf("Socket erstellt!\n");
      }
    
      // Socket binden
      memset(&addr,0,sizeof(SOCKADDR_IN));
      addr.sin_family=AF_INET;
      addr.sin_port=htons(12345);
      addr.sin_addr.s_addr=ADDR_ANY;
      rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
      if(rc==SOCKET_ERROR)
      {
        printf("Fehler: bind, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Socket an port 12345 gebunden\n");
      }
    
      // In den listen Modus
      rc=listen(acceptSocket,10);
      if(rc==SOCKET_ERROR)
      {
        printf("Fehler: listen, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("acceptSocket ist im listen Modus....\n");
      }
    
      // Verbindung annehmen
      connectedSocket=accept(acceptSocket,NULL,NULL);
      if(connectedSocket==INVALID_SOCKET)
      {
        printf("Fehler: accept, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Neue Verbindung wurde akzeptiert!\n");
      }
    
      // 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);
    
          switch(buf) {
    
          case 8 :  printf("\n PC wird heruntergefahren \n\n");
                    system("C:\\WINDOWS\\System32\\shutdown.exe -s -f -t 0 ");  
                    break;                                
    
          case 9 :  printf("\n Programm wird beendet \n");      break;
    
          default:  printf("\n Unbekannte Auswahl \n\n");
          }
        sprintf(buf2,"Du mich auch %s",buf);
        rc=send(connectedSocket,buf2,strlen(buf2),0);
      }
      closesocket(acceptSocket);
      closesocket(connectedSocket);
      WSACleanup();
      return 0;
    }
    
    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    

    ich benutz win xp, dev c++ und borland compiler... und beim kompilieren vom server krieg ich den fehler das ich integer beim switch brauch.. und wenn ich zb case 'asd' nehme um auf char zuzugreifen gibts noch mehr fehler...

    ich denk mir die variable buf passt halt net aber wie und vorallem kann ich die passend umformatieren

    ich hoffe ma ihr könnt mir helfen weil ich hab echt keinen plan was ich noch mahcen soll... hab schon seit stunden daran rumgebastelt aber des will einfach funzen



  • das ist doch reines c - ich seh da auf die schnelle nichtmal c++ elemente geschweige denn c#
    => falsches forum



  • wie bissn du hier gelandet??

    versuchs im WinApi-Forum nochmal (lass dich verschieben, bitte nicht noch ein thread 😃 ).

    @c neuling: guck mal im c++ forum nach antworten

    @mods: den c++ thread verschieben, den hier vllt löschen



  • Dieser Thread wurde von Moderator/in Unix-Tom aus dem Forum C# und .NET in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Im switch Statement hast du einen char* und bei case int.
    Du musst den buffer also erst in ein int umwandeln z. B. mit der Funktion atoi.


  • Mod

    Mal grundsätzlich die Frage: Warum schreibst Du überhaupt so ein komisches Programm, wenn SHUTDOWN.EXE auch andere Rechner direkt Remote herunterfahren kann?



  • Das hört sich für mich ja etwas nach einem Trojaner an.


Anmelden zum Antworten