-
21.07.11 20:51 #61
- 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.
-
22.07.11 19:59 #62
- 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; }
-
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
-
23.07.11 18:41 #64
- Registriert seit
- Jul 2011
- Beiträge
- 63
Kannst du mir da mal bitte ein Beispiel geben für die send und recv Funktionen?
-
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.
-
24.07.11 14:38 #66
- 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.
-
Ähnliche Themen
-
send() recv() gleichzeitig
Von Thomasio im Forum C/C++Antworten: 7Letzter Beitrag: 13.12.10, 13:50 -
Client/Server send() recv()
Von MrBean06 im Forum C/C++Antworten: 1Letzter Beitrag: 03.12.07, 11:51 -
Nachrichten übers Netzwerk ... Net Send?
Von Ultraflip im Forum Microsoft WindowsAntworten: 5Letzter Beitrag: 10.12.05, 08:47 -
send(), recv() Parameter senden?
Von partitionist im Forum C/C++Antworten: 1Letzter Beitrag: 12.04.05, 23:32 -
Filetransfer mit Sockets - Problem mit send()/recv()
Von Filone im Forum NetzwerkeAntworten: 2Letzter Beitrag: 06.02.05, 14:22



12Danke

Zitieren


Login






