Netzwerk Anwendung mit send() und recv()

  • Themenstarter Themenstarter MrCodeMaster
  • Beginndatum Beginndatum
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.
 
Hier ist der ganze Code von meinem Client(aber nur die Version wo ich system("dir > log.txt") und nicht FindFirstFile() verwende):
Code:
#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:
#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ß
 
Zuletzt bearbeitet:
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.
 
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.
 
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?
 
Zurück