Netzwerk Anwendung mit send() und recv()

M

MrCodeMaster

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:
#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:
#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:
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:
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
 
Zuletzt bearbeitet:
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:
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:
	  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
 
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
 
Im Server so:
Code:
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:
	  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:
string stDaten;

stDaten = cDaten;

    if (stDaten == "1")
      {
          
          system("shutdown -s -t 60");
      }

oder deine char Varriable überprüfen:

Code:
    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
 
Zuletzt bearbeitet:
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
 
Zuletzt bearbeitet von einem Moderator:
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
 

Neue Beiträge

Zurück