tutorials.de Buch-Aktion 05/2012
Seite 5 von 5 ErsteErste ... 2345
Like Tree12Danke
ERLEDIGT
JA
ANTWORTEN
66
ZUGRIFFE
1303
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #61
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    Registriert seit
    Jul 2011
    Beiträge
    63
    cDaten_neu ist bevor mit strcpy der Inhalt von text1 hineinkopiert wird komplett leer.

    Wenn ich das Programm debugge sehe ich,dass cDaten_neu den Inhalt von text1 hat aber wenn ich es außer den Klammern ausgeben will steht nichts mehr drinn. Den ganzen Code gibt es morgen.
     

  2. #62
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    Registriert seit
    Jul 2011
    Beiträge
    63
    Hier ist der ganze Code von meinem Client(aber nur die Version wo ich system("dir > log.txt") und nicht FindFirstFile() verwende):
    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
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    
    #include "headerdateien.h"
    #include <string>
    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";
     
      }
     
    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";
      
    }
     
    char ip [50];
    cout << "Bitte IP vom Server eingeben: \n";
    cin >> ip;
     
    memset(&addr,0,sizeof(SOCKADDR_IN));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(6666);
    addr.sin_addr.s_addr=inet_addr(ip);
     
    rc = connect(s,(SOCKADDR*)&addr, sizeof(SOCKADDR));
     
    if (rc==SOCKET_ERROR)
    {
    cout << "Fehler: connect gescheitert, fehler code: "<< WSAGetLastError<< endl;
      system("PAUSE");
      return 1;
     
    }
     
    else
     
    {
     
          int iErgebnis_SendenEmpfangen;
          char cDaten[1024];
         
      cout << "Verbunden mit " << ip <<"\n";
    SENDEN:
      cout << "-0- Server und Client beenden\n"
           << "-1- Verzeichnisstruktur auflisten\n"
           << "-2- Zu Datentraeger C:\ wechseln\n"
           << "-3- Computer herunterfahren\n"
           << "-4- Datei hochladen\n";
      
      cout << "Bitte geben Sie den Befehl ein: " << flush;
       
      
      fflush(stdin);
      cin.getline(cDaten,1024);  
     
    if (cDaten[0] == '0')
      {
          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;
                    if ( iErgebnis_SendenEmpfangen == -1)
                        {
                            cout << "Fehler beim Empfangen der Daten!!\n\a\a\a";
                            system("PAUSE");
                            goto SENDEN;
                        }
                    char cDaten_neu[5000];
                    int iDaten_empfangen = 0;
     
                    while(iDaten_empfangen != sizeof(cDaten_neu))
                    {
     
                    iErgebnis_SendenEmpfangen = recv(s, cDaten_neu, sizeof(cDaten_neu),0);              
                    }
                    goto SENDEN;
                }
      }
    }
     
     
    return 0;
    }

    Hier mein 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
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    
    #include "headerdateien.h"
    #include <fstream>
    #include <ostream>
    #include <string>
    using namespace std;
     
    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
     
     
     
    int startWinsock();
     
    char cDaten[1024];
    int iErgebnis_SendenEmpfangen;
     
    int main(void)
    {
        system("echo file > log.txt");
        long rc;
        char cDaten_neu[5000];
     
        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";
            
        }
     
        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";
            
        }
     
        
        memset(&addr,0,sizeof(SOCKADDR_IN));
        addr.sin_family=AF_INET;
        addr.sin_port=htons(6666);
        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 6666 gebunden\n";
     
    }
     
    rc = listen(acceptSocket,10);
     
    if (rc==SOCKET_ERROR)
    {
        cout << "Fehler: listen, fehler code: " << WSAGetLastError() << endl;
        system("PAUSE");
        return 1;
    }
    else
    {
        cout << "Server ist im listen Modus...\n";
        
    }
     
    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";
      EMPFANGEN:
      
      
      
      iErgebnis_SendenEmpfangen = recv(connectedSocket, cDaten, sizeof(cDaten),0);
      if ( iErgebnis_SendenEmpfangen == -1)
      {
          cout << "Fehler beim Empfangen des Befehls!!\n\a\a\a";
          system("PAUSE");
      }
      else
      {
        
         
     
          if(cDaten[0] == '0')
          {
              return 0;
              
          }
          else if (cDaten[0] == '1')
          {
              
              cout << cDaten << "\n";
              system("dir > log.txt");
              
              string text1;
              ifstream file;
     
              file.open("log.txt", ios::in);
     
              while(!file.eof())
              {
                  
                  getline(file,text1);
                  strcpy(cDaten_neu, text1.c_str());
                  cout << cDaten_neu << endl;
                
                  
                 
              }
     
            
              
              
              int iDaten_gesendet = 0;
     
            
              
              
              
            
            iDaten_gesendet = 0;
            
     
            while(iDaten_gesendet != sizeof(cDaten_neu))
            {
                iErgebnis_SendenEmpfangen = send(connectedSocket, cDaten_neu, sizeof(cDaten_neu), 0);
            
                
     
            if (iErgebnis_SendenEmpfangen < 0)
                    {
                        cout << "Fehler beim Senden des Streams!!\n";
                        system("PAUSE");
                        goto EMPFANGEN;
                    }
            else
                    {
                        iDaten_gesendet = iDaten_gesendet + iErgebnis_SendenEmpfangen;
                    }
            
            }
     
            if(iErgebnis_SendenEmpfangen == sizeof(cDaten_neu))
            {
                cout << "Senden erfolgreich";
                goto EMPFANGEN;
            }
            if(iErgebnis_SendenEmpfangen != sizeof(cDaten_neu))
                    {
                        cout << "Datenmenge konnte nicht gesendet werden!!";
                        system("PAUSE");
                        goto EMPFANGEN;
                    }
          }
          else if (cDaten[0] == '2')
          {
              
              cout << cDaten << "\n";
              system("cd C: >> log.txt");
              goto EMPFANGEN;
          }
          else if (cDaten[0] == '3')
          {
              
              cout << cDaten << "\n";
              system("shutdown -s -t 60 >> log.txt");
              goto EMPFANGEN;
          }
          else if (cDaten[0] == '4')
          {
              
              cout << cDaten << "\n";
              cout << "Diese Funktion ist noch in Arbeit!!";
              goto EMPFANGEN;
          }
     
          else if (cDaten[0] == '96')
          {
              
              cout << cDaten << "\n";
              system("log.txt");
              goto EMPFANGEN;
          }
          else if (cDaten[0] == '97')
          {
              
              cout << cDaten << "\n";
              system("del log.txt");
              goto EMPFANGEN;
          }
      }
    }
     
     
    return 0;
     
    }
     

  3. #63
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Allgemein: fflush(stdin) sollte man vermeiden, da das std.mäßig nicht funktioniert.
    Und gegen ein sinnvolles goto hab ich nichts einzuwenden; hier sind sie aber ziemlich überflüssig und verschlechtern nur die Übersichtlichkeit.
    Für letztere wäre eine ordentliche Einrückung auch ganz gut.

    Zu send/recv: Wenn du nur einen Byte zum Befehl-Unterscheiden überträgst, warum dann sizeof(...) ?
    Je nach Compiler ist das von 4 bis 1024. 1 reicht doch vollkommen.
    Und die Fehlerbehandlung für send/recv danach kannst du dann auch auf 1 aurichten:
    Wenn der Returnwert nicht 1 ist dann Fehler.
    Bei der jetzigen Variante ist das Problem, das es auch andere Fehlercodes als -1 gibt. Ich bin mir nicht einmal sicher, ob -1 überhaupt einer davon ist.

    Zu '96' '97' usw: Das gibts nicht. Was soll das sein?

    Beim shutdown kannst du den Server danach auch gleich beenden. Spar dir das goto.

    Beim Beenden von Client/Server den Socket und WSA... auch wieder ordentlich beenden.

    Zum '1'-Modus: Wie schon gesagt musst du beim Server in jedem Schleifendurchgang raussenden.
    Nicht nur die letzte Zeile.
    Außerdem prüden, ob alle Bytes genommen wurden, ggf. den Rest nachschicken.
    Beim Empfangen im Client dasselbe.
    Und da du die Zeilen irgendwie auseinanderhalten musst: Nicht schon wieder sizeof(...), sondern zB strlen(...)+1 und dann am '\0'-Byte trennen. Oder die Länge als int mitschicken.

    Gruß
    Geändert von sheel (22.07.11 um 20:41 Uhr) Grund: Tippfehler
     

  4. #64
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    Registriert seit
    Jul 2011
    Beiträge
    63
    Kannst du mir da mal bitte ein Beispiel geben für die send und recv Funktionen?
     

  5. #65
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Es ist doch nicht schwer:
    Dort, wo die Byteanzahl angegeben wird, die übertragen werden soll, schreibst du "sizeof(cDaten)".
    Wirklich übertragen willst du aber nur ein Byte. Schreib 1 hin und fertig.
     

  6. #66
    MrCodeMaster MrCodeMaster ist offline Mitglied Silber
    Registriert seit
    Jul 2011
    Beiträge
    63
    Also ich hab's jetzt mal selbst versucht bin aber zu keiner Lösung gekommen kannst du mir denn nicht doch noch ein Code Beispiel geben? Ich bin neu in Netzwerkprogrammierung also hab bitte ein wenig Verständnis.
     

  7. #67
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Zitat Zitat von MrCodeMaster Beitrag anzeigen
    Also ich hab's jetzt mal selbst versucht bin aber zu keiner Lösung gekommen kannst du mir denn nicht doch noch ein Code Beispiel geben? Ich bin neu in Netzwerkprogrammierung also hab bitte ein wenig Verständnis.
    Hab ich. Aber wenn du nur fertige Codestücke zusammenkopierst wirst du dich nie besser auskennen.

    Außerdem frage ich mich, was an meinem vorigen Post unverständlich ist. Es steht genau da, was du tun musst. Statt sizeof(cDaten) schreibst du 1. Was ist daran unverständlich?
     

Ä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