-
15.07.11 11:53 #1
- 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.
-
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üßeGeändert von Crash Kid (15.07.11 um 12:10 Uhr)
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.
-
15.07.11 12:54 #3
- 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"); }
-
Hallo,
du musst zum Lesen den Socket verwenden, den du via 'accept' erhalten hat, also statt 'acceptSocket' den 'connectedSocket'.
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
15.07.11 18:12 #5
- 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
-
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.
-
15.07.11 18:30 #7
- 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"); } }
-
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üßeGeändert von Crash Kid (15.07.11 um 19:08 Uhr)
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.
-
15.07.11 19:18 #9
- 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 corruptedGeändert von MrCodeMaster (15.07.11 um 19:47 Uhr)
-
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
-
15.07.11 21:04 #11
- 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.
-
16.07.11 10:24 #12
- 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; } } }
-
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üßeWenn 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.
-
16.07.11 20:01 #14
- Registriert seit
- Jul 2011
- Beiträge
- 63
Und wie genau müsste das aussehen?
-
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üßeWenn 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
-
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






