tutorials.de Buch-Aktion 05/2012
Seite 1 von 5 1234 ... LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
66
ZUGRIFFE
1303
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    Registriert seit
    Jul 2011
    Beiträge
    63
    Hey Leute bin neu hier und hab mal eine Frage.

    Ich hab eine Server und eine Client Anwendung geschrieben die auch funktioniert! Jetzt hab ich nur das Problem, dass ich Befehle vom Client zum Server schicken will.

    Ich möchte beim Client einen System Befehl eingeben den am Server empfangen und dann ausführen lassen.

    Das funktioniert mit system(befehl) aber da sagt er mir immer, dass die Variable vom Typ const char* nicht mit char kompatibel ist. Und er sendet auch keinen Befehl übers Netzwerk.

    Ich geb euch mal meinen Code und hoffe auf Antworten.
    Server:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    
    #include "headerdateien.h"
     
    using namespace std;
     
    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
     
    int startWinsock();
     
    int main(void)
    {
        long rc;
     
        SOCKET acceptSocket;
        SOCKADDR_IN addr;
        SOCKET connectedSocket;
        rc = startWinsock();
     
        if(rc!=0)
        {
            cout << "Fehler: startWinsock, Fehlercode: "<< rc << endl;
            system ("PAUSE");
            return 1;
     
        }
        else
        {
            cout << "Winsock gestartet\n";
            system("PAUSE");
        }
     
        acceptSocket=socket(AF_INET,SOCK_STREAM,0);
     
        if (acceptSocket==INVALID_SOCKET)
        {
            cout << "Fehler der Socket konnte nicht erstellt werden, Fehlercode: " << WSAGetLastError() << endl;
     
            system("PAUSE");
            return 1;
        }
        else
        {
            cout << "Socket erstellt\n";
            system ("PAUSE");
        }
     
        
        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)
    {
      cout << "Fehler: bind, fehler code:" << WSAGetLastError << endl;
      system("PAUSE");
      return 1;
    }
    else
    {
        cout << "Socket an port 12345 gebunden\n";
        system ("PAUSE");
    }
     
    rc = listen(acceptSocket,10);
     
    if (rc==SOCKET_ERROR)
    {
        cout << "Fehler: listen, fehler code: " << WSAGetLastError() << endl;
        system("PAUSE");
        return 1;
    }
    else
    {
        cout << "acceptSocket ist im listen Modus...\n";
        system("PAUSE");
    }
     
    connectedSocket=accept(acceptSocket,NULL,NULL);
     
    if(connectedSocket==INVALID_SOCKET)
    {
      cout << "Fehler: accept, fehler code: " << WSAGetLastError()<<endl;
      system("PAUSE");
      return 1;
     
    }
    else
     
    {
     
      cout << "Neue Verbindung wurde akzeptiert!\n";
     
    }
     
    system (hier soll der Empfangene Befehl rein kommen); // wie empfange ich Befehle****
    return 0;
     
    }

    Client:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    
    #include "headerdateien.h"
     
    using namespace std;
     
    int startWinsock(void)
    {
     WSADATA wsa;
     return WSAStartup(MAKEWORD(2,0),&wsa);
    }
     
    int startWinsock(void);
     
    int main()
    {
     
    long rc;
    SOCKET s;
    SOCKADDR_IN addr;
     
     
    rc=startWinsock();
     
      if(rc!=0)
     
      {
     
        cout << "Fehler: startWinsock, fehler code: " << rc << endl;
        system("PAUSE");
        return 1;
     
      }
     
      else
     
      {
     
        cout << "Winsock gestartet!\n";
        system("PAUSE");
      }
     
    s=socket(AF_INET,SOCK_STREAM,0);
     
    if(s==INVALID_SOCKET)
     
    {
     
      cout << "Fehler: Der Socket konnte nicht erstellt werden, fehlercode: "<< WSAGetLastError()<< endl;
      system("PAUSE");
      return 1;
     
    }
     
    else
     
    {
     
      cout << "Socket erstellt!\n";
      system("PAUSE");
    }
     
    memset(&addr,0,sizeof(SOCKADDR_IN));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(12345);
    addr.sin_addr.s_addr=inet_addr("127.0.0.1");
     
    rc = connect(s,(SOCKADDR*)&addr, sizeof(SOCKADDR));
     
    if (rc==SOCKET_ERROR)
    {
    cout << "Fehler: connect gescheitert, fehler code: "<< WSAGetLastError<< endl;
      system("PAUSE");
      return 1;
     
    }
     
    else
     
    {
     
      cout << "Verbunden mit 127.0.0.1..\n";
      system ("PAUSE");
     
    }
     
    //hier soll er die Befehle mit cin einlesen und weitersenden aber wie****
     
    return 0;
        
    }

    Natürlich bedanke ich mich auch schon mal im Vorraus für die Bemühungen.
     

  2. #2
    Crash Kid Crash Kid ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    147
    Hallo,

    wie du schon als Thema geschrieben hast, sendest du allgemein Daten mit send() und empfangen tust du sie mit recv(). Die Daten können alles mögliche sein, in deinem Fall eben ein Befehl.

    Code :
    1
    2
    3
    4
    5
    6
    7
    
    int iErgebnis_SendenEmpfangen;
    char cDaten[1024];
    SOCKET Socket_1;
     
    iErgebnis_SendenEmpfangen = send(Socket_1, cDaten, sizeof(cDaten), 0);
     
    iErgebnis_SendenEmpfangen = recv(Socket_1, cDaten, sizeof(cDaten), 0);

    In der int Variable "iErgebnis_SendenEmpfangen" stehen bei erfolgreichem senden bzw. empfangen die anzahl der Bytes drin, die gesendet bzw. empfangen wurden. Falls ein Fehler auftritt, steht -1 drin.

    Code :
    1
    2
    3
    4
    
    if(iErgebnis_SendenEmpfangen == -1)
    {
        cout << "Fehler beim senden bzw. empfangen" << endl;
    }

    Du musst eigentlich nur noch die 2 Funktionen in dein Programm einfügen, dann sollte es sofort gehen. Den Befehl ausführen müsstest du mit "system(cDaten);" schaffen.

    grüße
    Geändert von Crash Kid (15.07.11 um 12:10 Uhr)
    MrCodeMaster bedankt sich. 
    Wenn meine Antwort nützlich bzw. hilfreich war, würde ich mich sehr über eine Bewertung bzw. ein Danke sehr freuen.

    Danke euch


    Programmiere in C, C++ auf Windows XP, Vista und Windows 7
    Spezialisiert auf Netzwerkprogrammierung, WinAPI uvm.

  3. #3
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    Registriert seit
    Jul 2011
    Beiträge
    63
    Ich habe das jetzt so gemacht wie du gesagt hast bekomme aber bei meinem Server immer die Meldung: Fehler beim Empfangen des Befehls also was mach ich falsch? hier wieder mein Code.
    Server:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    cout << "Neue Verbindung wurde akzeptiert!\n";
      char cDaten[1024];
      int iErgebnis_SendenEmpfangen;
      
      iErgebnis_SendenEmpfangen = recv(acceptSocket, cDaten, sizeof(cDaten), 0);
      if ( iErgebnis_SendenEmpfangen == -1)
      {
          cout << "Fehler beim Empfangen der Daten!!\n";
          system("PAUSE");
      }
      else
      {
          cout << cDaten;
          system ("PAUSE");
      }
    }

    Client:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
     
          int iErgebnis_SendenEmpfangen;
          char cDaten[1024];
         
      cout << "Verbunden mit 127.0.0.1..\n";
      cout << "Bitte geben Sie den Befehl ein: ";
      cin >> cDaten;
     
      iErgebnis_SendenEmpfangen = send(s, cDaten, sizeof(cDaten), 0);
      if ( iErgebnis_SendenEmpfangen < 0)
      {
          cout << "Fehler beim Senden der Daten!!\n";
          system("PAUSE");
      }
      else
      {
          cout << cDaten;
          system ("PAUSE");
      }
     

  4. #4
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Hallo,

    du musst zum Lesen den Socket verwenden, den du via 'accept' erhalten hat, also statt 'acceptSocket' den 'connectedSocket'.

    Gruß
    MCoder
    MrCodeMaster bedankt sich. 
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  5. #5
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    Registriert seit
    Jul 2011
    Beiträge
    63
    Ich hab jetzt noch ein Problem und zwar schreibt er mir denBefehl(bei mir 1) nicht in die Variable cDaten er schreibt immer einen falschen Wert hinein und somit funktioniert es auch nicht.

    Bitte um Hilfe
     

  6. #6
    Crash Kid Crash Kid ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    147
    Wie schreibst du den Wert in die Varriable? Codeauszug?
     
    Wenn meine Antwort nützlich bzw. hilfreich war, würde ich mich sehr über eine Bewertung bzw. ein Danke sehr freuen.

    Danke euch


    Programmiere in C, C++ auf Windows XP, Vista und Windows 7
    Spezialisiert auf Netzwerkprogrammierung, WinAPI uvm.

  7. #7
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    Registriert seit
    Jul 2011
    Beiträge
    63
    Im Server so:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    cout << "Neue Verbindung wurde akzeptiert!\n";
     
      char cDaten[1];
      int iErgebnis_SendenEmpfangen;
      
      iErgebnis_SendenEmpfangen = recv(connectedSocket, cDaten, sizeof(cDaten),0);
      if ( iErgebnis_SendenEmpfangen == -1)
      {
          cout << "Fehler beim Empfangen der Daten!!\n";
          system("PAUSE");
      }
      else
      {
          cout << cDaten << endl;
     
        
          
          if (cDaten[1] == 1)
          {
              
              system("shutdown -s -t 60");
          }
      }

    Und im Client so:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
     
          int iErgebnis_SendenEmpfangen;
          char cDaten[1024];
         
      cout << "Verbunden mit 127.0.0.1..\n";
      cout << "Bitte geben Sie den Befehl ein: ";
      cin >> cDaten;
     
      iErgebnis_SendenEmpfangen = send(s, cDaten, sizeof(cDaten), 0);
      if ( iErgebnis_SendenEmpfangen < 0)
      {
          cout << "Fehler beim Senden der Daten!!\n";
          system("PAUSE");
      }
      else
      {
          cout << cDaten << endl;
          system ("PAUSE");
      }
     
    }
     

  8. #8
    Crash Kid Crash Kid ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    147
    Du schreibst in deinem Client dann vermutlich die Zahl 1 rein, oder?
    Wenn ja, dann sieht dein Programm aber nicht die "Zahl" 1, sondern als "Zeichen" 1.
    Du müsstest den Inhalt (in deiner Server-Anwendung) in eine string Variable vorher schreiben und sie so überprüfen:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    string stDaten;
     
    stDaten = cDaten;
     
        if (stDaten == "1")
          {
              
              system("shutdown -s -t 60");
          }

    oder deine char Varriable überprüfen:

    Code :
    1
    2
    3
    4
    5
    
        if (cDaten == '1')
          {
              
              system("shutdown -s -t 60");
          }

    Du überprüfst momentan den Dezimal-Wert von dem ASCII-Zeichen, was an der Stelle [1] steht. Da würde momentan das Zeichen "\0" stehen, was das Ende des Strings bedeutet. Du müsstest wenn dann an der Stelle [0] überprüfen, da würde dann die Zahl 49 sein. Weil das der Dezimalwert vom ASCII-Zeichen 1 ist.

    Hoffe ich konnte dir helfen und es einigermaßen verständlich erklären

    grüße
    Geändert von Crash Kid (15.07.11 um 19:08 Uhr)
    MrCodeMaster bedankt sich. 
    Wenn meine Antwort nützlich bzw. hilfreich war, würde ich mich sehr über eine Bewertung bzw. ein Danke sehr freuen.

    Danke euch


    Programmiere in C, C++ auf Windows XP, Vista und Windows 7
    Spezialisiert auf Netzwerkprogrammierung, WinAPI uvm.

  9. #9
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    Registriert seit
    Jul 2011
    Beiträge
    63
    Ich bedanke mich bei allen die mir geholfen haben.

    Hab aber noch eine Frage.

    Wenn ich das Programm jetzt ausführe 1 eingeb wird der Befehl gesendet und auch ausgeführt funktioniert wie geschmiert. Aber wenn ich den Client jetzt beenden will sagt er mir:
    Stack around the variable 'cDaten' was corrupted
    Geändert von MrCodeMaster (15.07.11 um 19:47 Uhr)
     

  10. #10
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Hallo,

    wenn der Socket geschlossen wird, gibt 'recv' den Wert 0 zurück und in cDaten steht kein gültiger Text. Du musst also außer auf -1 (Fehler) auch auf 0 (Verbindung geschlossen) prüfen.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  11. #11
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    Registriert seit
    Jul 2011
    Beiträge
    63
    Danke hat sich aber schon gelöst und zwar war mein char zu klein ich hab nur char [1] gehabt und deswegen hat es Probleme mit dem Stack gegeben.
     

  12. #12
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    Registriert seit
    Jul 2011
    Beiträge
    63
    Nachdem ihr mir ja so gut geholfen habt habe ich jetzt noch eine Frage.

    Und zwar möchte ich einen ganzen Befehl wie z.B.: dir einlesen bis er zum Terminierungszeichen \0 kommt und dann diesen Befehl senden aber bei mir funktioniert das nicht was mach ich falsch****

    Hier noch mal mein Code:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
    out << "Bitte geben Sie den Befehl ein: ";
      while(cDaten[0] != EOF)
      {
      cDaten[0] = getchar();
      }
      
     
      if (cDaten[0] == '5')
      {
          cout << "Server und Client werden beendet....\n\a";
          
          iErgebnis_SendenEmpfangen = send(s, cDaten, sizeof(cDaten), 0);
            if ( iErgebnis_SendenEmpfangen < 0)
                {
                    cout << "Fehler beim Senden des Befehls!!\n";
                    system("PAUSE");
                }
         
         return 0;
      }
      else
      {
        iErgebnis_SendenEmpfangen = send(s, cDaten, sizeof(cDaten), 0);
            if ( iErgebnis_SendenEmpfangen < 0)
                {
                    cout << "Fehler beim Senden des Befehls!!\n";
                    system("PAUSE");
                }
            else
                {
                    cout << cDaten << endl;
                    goto SENDEN;
          
                }
      }
    }
     

  13. #13
    Crash Kid Crash Kid ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    147
    Du willst ja dann, wenn du "dir" senden willst, auf ein char-Array, 3 Zeichen schreiben. Das geht natürlich nicht. Du musst die Eingabe einfach allgemein cDaten zuweisen. Müsstest des [0] weglassen. Musst aber dann eine andere Varriante nehmen um die Eingabe einzulesen, da getchar() einen int-Wert zurückliefert. Und cDaten, muss natürlich auch groß genug sein .

    grüße
     
    Wenn meine Antwort nützlich bzw. hilfreich war, würde ich mich sehr über eine Bewertung bzw. ein Danke sehr freuen.

    Danke euch


    Programmiere in C, C++ auf Windows XP, Vista und Windows 7
    Spezialisiert auf Netzwerkprogrammierung, WinAPI uvm.

  14. #14
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    Registriert seit
    Jul 2011
    Beiträge
    63
    Und wie genau müsste das aussehen?
     

  15. #15
    Crash Kid Crash Kid ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    147
    Ich hab schon lang nicht mehr in der Konsole programmiert, aber fürher hab ich Zeicheneingaben so eingelesen:

    Code :
    1
    2
    3
    4
    
    string stEingabe;
     
    cout << "Bitte geben sie etwas ein: " << flush;
    cin >> stEingabe;

    Dann hast du deine Eingabe in einer string-Varriable drin.
    Wenn du die jetzt versenden willst, musst du die in eine char-Varriable umschreiben:

    Code :
    1
    2
    3
    4
    
    string stEingabe;
    char cEingabe[1024];
     
    strcpy(cEingabe, stEingabe.c_str());

    Damit sollte es funktionieren...

    grüße
     
    Wenn meine Antwort nützlich bzw. hilfreich war, würde ich mich sehr über eine Bewertung bzw. ein Danke sehr freuen.

    Danke euch


    Programmiere in C, C++ auf Windows XP, Vista und Windows 7
    Spezialisiert auf Netzwerkprogrammierung, WinAPI uvm.

Ähnliche Themen

  1. send() recv() gleichzeitig
    Von Thomasio im Forum C/C++
    Antworten: 7
    Letzter Beitrag: 13.12.10, 13:50
  2. Client/Server send() recv()
    Von MrBean06 im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 03.12.07, 11:51
  3. Nachrichten übers Netzwerk ... Net Send?
    Von Ultraflip im Forum Microsoft Windows
    Antworten: 5
    Letzter Beitrag: 10.12.05, 08:47
  4. send(), recv() Parameter senden?
    Von partitionist im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 12.04.05, 23:32
  5. Antworten: 2
    Letzter Beitrag: 06.02.05, 14:22