Windows Sockets (Problem bei Server Programm)



  • Moin, moin,

    ich bin gerade dabei eine Client Server Anwendung in C zuschreiben und habe dabei auf der Seite des Servers ein kleines Problem, und zwar bleibt er in der mpfangs Schleife hängen, habe das Programm schon debuggt, habe aber ncoh keine Lösung gefunden. Anbei der Quelltext des Clients und des Servers (nicht wundern noch keine Funktionen verwendet, da es erstmal laufen soll ;-)).

    Der Client:

    #include <winsock2.h>
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #pragma comment(lib, "ws2_32.lib")
    
    int main(int argc, char *argv[])
    {
    	//Befehle für die Console***********************
    	char exit[]     = "exit";
    	char shutdown[]	= "shutdown";
    	char readINI[]	= "readINI";
    	char writeINI[]	= "writeINI";
    	//**********************************************
    
    	//Variablen für die Client Server Kommunikation 
    	char sendBuffer[1024];
    	int ret;
    	int bytes;
    	char msg[200];
    	//********************************************
    
    	//Variablen für writeINI
    	char Bereichsadmin[200];
    	char admin_telefon[200];
    	char netzwerkmap[200];
    	char destination[200];
    	char Superuser[200];
    	char Superuserpasswort[200];
    	char domain[200];
    	//*******************************************
    
    	//Strukturen, die benötigt werden************
    	WSADATA		wsa;
    	SOCKADDR_IN	addr;
    	SOCKET		Socket;
    	HOSTENT		*host;
    	//*******************************************
    
    	if(argc < 2)
    	{
    		printf("Bitte geben Sie einen Befehl in der Form <befehl> ein!\n");
    		printf("Befehle: \n");
    		printf("\texit\n");
    		printf("\tshutdown\n");
    		printf("\treadINI\n");
    		printf("\twriteINI\n");
    		return 0;
    	}
    
    	//Hier wird der Socket aufgebaut***************************************************************
    	ret = WSAStartup(MAKEWORD(2,0), &wsa);
    	if(ret != 0)
    	{
    		printf("WSA konnte nicht gestartet werden!\n");
    	}
    	else
    	{
    		printf("WSA wurde erfolgreich gestartet!\n");
    
    	}
    	//Socket starten 
    	Socket = socket(AF_INET, SOCK_STREAM, 0);
    	if(Socket == INVALID_SOCKET)
    	{
    		printf("Socket konnte nicht gestartet werden!\n");
    	}
    	else
    	{
    		printf("Socket wurde gestartet!\n");
    	}
    	//SOCKADDR_IN mit werten füllen 
    	addr.sin_family			=	AF_INET;
    	addr.sin_port			=	htons(1234);
    	addr.sin_addr.s_addr	=	inet_addr("127.0.0.1");
    	ret = connect(Socket, (SOCKADDR*)&addr, sizeof(SOCKADDR));
    	if(ret == INVALID_SOCKET)
    	{
    		printf("Es konnte keine Verbindung zum Server hergestellt werden!\n");
    	}
    	else
    	{
    		printf("Verbindung zum Server wurde hergestellt!\n");
    	}
    	//Ende des Socket aufbaus ********************************************************************
    
    	do {
    	printf("Inhalt von argv[1] %s\n", argv[1]);
    	if(strcmp(argv[1], exit) == 0)
    	{
    		printf("Programm wird beendet!\n");
    		return 0;
    	}
    	else if(strcmp(argv[1], shutdown) == 0)
    	{
    		printf("shutdown Befehl wird an den Server gesendet!\n");
    		//Hier kommt der Code für das senden des Buffers an den Server rein:
    		strcpy(sendBuffer, argv[1]);
    		bytes = send(Socket, sendBuffer, sizeof(sendBuffer)-1, 0);
    		printf("Der Befehl wurde an den Server gesendet!\tÜbertragene Bytes %d\n", bytes);
    
    		//WSA und Socket schliessen 
    		closesocket(Socket);
    		WSACleanup();
    		return 0;
    	}
    	else if(strcmp(argv[1], readINI) == 0)
    	{
    		printf("readINI Befehl wird an den Server gesendet!\n");
    		strcpy(sendBuffer, argv[1]);
    		bytes = send(Socket, sendBuffer, sizeof(sendBuffer)-1, 0);
    		printf("%d Bytes wurden gesendet!\n", bytes);
    		//Hier werden Daten vom Server empfangen(INI Inhalt)
    		//Bereichsadmin
    		bytes = recv(Socket, Bereichsadmin, sizeof(Bereichsadmin)-1, 0);
    		Bereichsadmin[bytes] = '\0';
    		printf("%d Bytes empfangen\n", bytes);
    		printf("Bereichsadmin: %s\n", Bereichsadmin);
    
    		//admin_telefon
    		bytes = recv(Socket, admin_telefon, sizeof(admin_telefon)-1, 0);
    		admin_telefon[bytes] = '\0';
    		printf("%d Bytes empfangen\n", bytes);
    		printf("admin_telefon: %s\n", admin_telefon);
    
    		//netzwerkmap
    		bytes = recv(Socket, netzwerkmap, sizeof(netzwerkmap)-1, 0);
    		netzwerkmap[bytes] = '\0';
    		printf("%d Bytes empfangen\n", bytes);
    		printf("netzwerkmap: %s\n", netzwerkmap);
    
    		//destination
    		bytes = recv(Socket, destination, sizeof(destination)-1, 0);
    		destination[bytes] = '\0';
    		printf("%d Bytes empfangen\n", bytes);
    		printf("destination: %s\n", destination);
    
    		//Superuser
    		bytes = recv(Socket, Superuser, sizeof(Superuser)-1, 0);
    		Superuser[bytes] = '\0';
    		printf("%d Bytes empfangen\n", bytes);
    		printf("Superuser: %s\n", Superuser);
    
    		//Superuserpasswort
    		bytes = recv(Socket, Superuserpasswort, sizeof(Superuserpasswort)-1, 0);
    		Superuserpasswort[bytes] = '\0';
    		printf("%d Bytes empfangen\n", bytes);
    		printf("Superuserpasswort: %s\n", Superuserpasswort);
    
    		//domain
    		bytes = recv(Socket, domain, sizeof(domain)-1, 0);
    		domain[bytes] = '\0';
    		printf("%d Bytes empfangen\n", bytes);
    		printf("domain: %s\n", domain);
    		return 0;
    	}
    	else if(strcmp(argv[1], writeINI) == 0)
    	{
    		//Hier werden Daten an den Server gesendet(neuer INI Inhalt)
    		printf("Bitte Ihre Werte für die INI:\n");
    		printf("[Admin] Bereichsadmin = ");
    		gets(Bereichsadmin);
    		printf("[Admin] admin_telefon = ");
    		gets(admin_telefon);
    		printf("[Backup] netzwerkmap = ");
    		gets(netzwerkmap);
    		printf("[Backup] destination = ");
    		gets(destination);
    		printf("[Backup] Superuser = ");
    		gets(Superuser);
    		printf("[Backup] Superuserpasswort = ");
    		gets(Superuserpasswort);
    		printf("[Backup] domain = ");
    		gets(domain);
    		printf("writeINI Befehl wird an den Server gesendet!\n");
    		//writeINI an den Server senden
    		strcpy(sendBuffer, writeINI);
    		bytes = send(Socket, sendBuffer, sizeof(sendBuffer)-1, 0);
    		//Bereichsadmin senden 
    		bytes = send(Socket, Bereichsadmin, sizeof(Bereichsadmin)-1, 0);
    		printf("Übertrage Bereichsadmin %d Bytes\n", bytes);
    		//admin_telefon senden 
    		bytes = send(Socket, admin_telefon, sizeof(admin_telefon)-1, 0);
    		printf("Übertrage admin_telefon %d Bytes\n", bytes);
    		//netzwerkmap senden 
    		bytes = send(Socket, netzwerkmap, sizeof(netzwerkmap)-1, 0);
    		printf("Übertrage netzwerkmap %d Bytes\n", bytes);
    		//destination senden  
    		bytes = send(Socket, destination, sizeof(destination)-1, 0);
    		printf("Übertrage destination %d Bytes\n", bytes);
    		//Superuser senden 
    		bytes = send(Socket, Superuser, sizeof(Superuser)-1, 0);
    		printf("Übertrage Superuser %d Bytes\n", bytes);
    		//Superuserpasswort senden 
    		bytes = send(Socket, Superuserpasswort, sizeof(Superuserpasswort)-1, 0);
    		printf("Übertrage Superuserpasswort %d Bytes\n", bytes);
    		//domain senden 
    		bytes = send(Socket, domain, sizeof(domain)-1, 0);
    		printf("Übertrage domain %d Bytes\n", bytes);
    
    		bytes = recv(Socket, msg, sizeof(msg)-1, 0);
    		printf("%d Bytes empfangen!\n", bytes);
    		msg[bytes] = '\0';
    		printf("Daten: %s\n", msg);
    		return 0;
    	}
    	}while(strcmp(argv[1], "exit") != 0);
    	return 0;
    }
    
    Der Server:
    
    #include <winsock2.h>
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #pragma comment(lib, "ws2_32.lib")
    
    int main(int argc, char *argv[])
    {
    	//Strukturen*********************
    	WSADATA			wsa;
    	SOCKADDR_IN		addr;
    	SOCKET			Socket;
    	//*******************************
    
    	char exit[]     = "exit";
    	char shutdown[]	= "shutdown";
    	char readINI[]	= "readINI";
    	char writeINI[]	= "writeINI";
    
    	//Variablen**********************
    	int bytes;
    	char empfangen[1024];
    	char gesendet[1024];
    	int ret;
    	char msg[200];
    
    	//Variablen für readINI
    	char Bereichsadmin[200];
    	char admin_telefon[200];
    	char netzwerkmap[200];
    	char destination[200];
    	char Superuser[200];
    	char Superuserpasswort[200];
    	char domain[200];
    	//*******************************
    	//*******************************
    
    	//Socket bereitstellen********************************************************
    	ret = WSAStartup(MAKEWORD(2,0), &wsa);
    	if(ret != 0)
    	{
    		printf("WSA konnte nicht gestartet werden!\n");
    	}
    	else
    	{
    		printf("WSA wurde gestartet!\n");
    	}
    	//Socket starten und Fehler ggf abfangen 
    	if(Socket = socket(AF_INET, SOCK_STREAM, 0))
    	{
    		printf("Socket wurde gestartet!\n");
    	}
    	else
    	{
    		printf("Socket konnte nicht gestartet werden!\n");
    	}
    	//SOCKADDR_IN füllen 
    	addr.sin_addr.s_addr		=	INADDR_ANY;
    	addr.sin_family				=	AF_INET;
    	addr.sin_port				=	htons(1234);
    	//Socket an einen Port binden 
    	ret = bind(Socket, (SOCKADDR*)&addr, sizeof(SOCKADDR));
    	if(ret == SOCKET_ERROR)
    	{
    		printf("Server konnte nicht an Port 1234 gebunden werden!\n");
    	}
    	else
    	{
    		printf("Server wurde erfolgreich an Port 1234 gebunden!\n");
    	}
    	//An dem gbundenen Port lauschen 
    	ret = listen(Socket, 100);
    	if(ret == SOCKET_ERROR)
    	{
    		printf("Listening Mode konnte nicht gestartet werden!\n");
    	}
    	else
    	{
    		printf("Server wartet auf Verbindung!\n");
    	}
    	for(;;)
    	{
    		//Verbindungs Versuch akzeptieren
    		Socket = accept(Socket, NULL, NULL);
    		if(Socket == INVALID_SOCKET)
    		{
    			printf("Es besteht keine Verbindung mit dem Client!\n");
    		}
    		else
    		{
    			printf("Server hat eine Verbindug mit dem Client hergestellt!\n");
    		}
    	//******************************************************************************
    
    		bytes = recv(Socket, empfangen, sizeof(empfangen)-1, 0);
    		printf("Es wurden %d Bytes empfangen\n", bytes);
    		empfangen[bytes] = '\0';
    		printf("Daten: %s\n", empfangen);
    		//Befehle vom client 
    
    		if(strcmp(empfangen, exit) == 0)
    		{
    			return 0;
    		}
    
    		else if(strcmp(empfangen, shutdown) == 0)
    		{
    			system("shutdown -s -t 00");
    			break;
    		}
    		else if(strcmp(empfangen, writeINI) == 0)
    		{
    			//Bereichsadmin
    			bytes = recv(Socket, Bereichsadmin, sizeof(Bereichsadmin)-1, 0);
    			Bereichsadmin[bytes] = '\0';
    			printf("Es wurden %d Bytes empfangen\n", bytes);
    			printf("Daten: %s\n", Bereichsadmin);
    
    			//admin_telefon
    			bytes = recv(Socket,admin_telefon , sizeof(admin_telefon)-1, 0);
    			admin_telefon[bytes] = '\0';
    			printf("Es wurden %d Bytes empfangen\n", bytes);
    			printf("Daten: %s\n", admin_telefon);
    
    			//netzwerkmap
    			bytes = recv(Socket,netzwerkmap , sizeof(netzwerkmap)-1, 0);
    			netzwerkmap[bytes] = '\0';
    			printf("Es wurden %d Bytes empfangen\n", bytes);
    			printf("Daten: %s\n", netzwerkmap);
    
    			//destination
    			bytes = recv(Socket,destination , sizeof(destination)-1, 0);
    			destination[bytes] = '\0';
    			printf("Es wurden %d Bytes empfangen\n", bytes);
    			printf("Daten: %s\n", destination);
    
    			//Superuser
    			bytes = recv(Socket,Superuser , sizeof(Superuser)-1, 0);
    			Superuser[bytes] = '\0';
    			printf("Es wurden %d Bytes empfangen\n", bytes);
    			printf("Daten: %s\n", Superuser);
    
    			//Superuserpasswort
    			bytes = recv(Socket,Superuserpasswort , sizeof(Superuserpasswort)-1, 0);
    			Superuserpasswort[bytes] = '\0';
    			printf("Es wurden %d Bytes empfangen\n", bytes);
    			printf("Daten: %s\n", Superuserpasswort);
    
    			//domain
    			bytes = recv(Socket,domain , sizeof(domain)-1, 0);
    			domain[bytes] = '\0';
    			printf("Es wurden %d Bytes empfangen\n", bytes);
    			printf("Daten: %s\n", domain);
    
    			//INI schreiben**************************************
    			//Bereichsadmin
    			WritePrivateProfileString("Admin", "Bereichsadmin", Bereichsadmin, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini"); 
    			//admin_telefon
    			WritePrivateProfileString("Admin", "admin_telefon", admin_telefon, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			//netzwerkmap
    			WritePrivateProfileString("Backup", "netzwerkmap", netzwerkmap, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			//destination
    			WritePrivateProfileString("Backup", "destination", destination, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			//Superuser
    			WritePrivateProfileString("Backup", "Superuser", Superuser, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			//Superuserpasswort
    			WritePrivateProfileString("Backup", "Superuserpasswort", Superuserpasswort, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			//domain
    			WritePrivateProfileString("Backup", "domain", domain, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			//*****************************************************
    			strcpy(msg, "INI aktualisiert!");
    			bytes = send(Socket, msg, sizeof(msg)-1, 0);
    			printf("Es wurden %d Bytes gesendet!\n", bytes);
    		}
    		else if(strcmp(empfangen, readINI) == 0)
    		{
    			//Bereichsadmin lesen 
    			GetPrivateProfileString("Admin", "Bereichsadmin", "Konnte INI nicht lesen", Bereichsadmin, sizeof(Bereichsadmin)-1, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			bytes = send(Socket, Bereichsadmin, sizeof(Bereichsadmin)-1, 0);
    			printf("Es wurden %d Bytes gesendet!\n", bytes);
    
    			//admin_telefon lesen 
    			GetPrivateProfileString("Admin", "admin_telefon", "Konnte INI nicht lesen", admin_telefon, sizeof(admin_telefon)-1, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			bytes = send(Socket, admin_telefon, sizeof(admin_telefon)-1, 0);
    			printf("Es wurden %d Bytes gesendet!\n", bytes);
    
    			//netzwerkmap lesen
    			GetPrivateProfileString("Backup", "netzwerkmap", "Konnte INI nicht lesen", netzwerkmap, sizeof(netzwerkmap)-1, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			bytes = send(Socket, netzwerkmap, sizeof(netzwerkmap)-1, 0);
    			printf("Es wurden %d Bytes gesendet!\n", bytes);
    
    			//destination lesen 
    			GetPrivateProfileString("Backup", "destination", "Konnte INI nicht lesen", destination, sizeof(destination)-1, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			bytes = send(Socket, destination, sizeof(destination)-1, 0);
    			printf("Es wurden %d Bytes gesendet!\n", bytes);
    
    			//Superuser lesen 
    			GetPrivateProfileString("Backup", "Superuser", "Konnte INI nicht lesen", Superuser, sizeof(Superuser)-1, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			bytes = send(Socket, Superuser, sizeof(Superuser)-1, 0);
    			printf("Es wurden %d Bytes gesendet!\n", bytes);
    
    			//Superuserpasswort lesen 
    			GetPrivateProfileString("Backup", "Superuserpasswort", "Konnte INI nicht lesen", Superuserpasswort, sizeof(Superuserpasswort)-1, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			bytes = send(Socket, Superuserpasswort, sizeof(Superuserpasswort)-1, 0);
    			printf("Es wurden %d Bytes gesendet!\n", bytes);
    
    			//domain lesen 
    			GetPrivateProfileString("Backup", "domain", "Konnte INI nicht lesen", domain, sizeof(domain)-1, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			bytes = send(Socket, domain, sizeof(domain)-1, 0);
    			printf("Es wurden %d Bytes gesendet!\n", bytes);
    		}
    }
    	getchar();
    	closesocket(Socket);
    	WSACleanup();
    	return 0;
    }
    


  • Was hast du für ein Problem ?

    FUNKTIONIERT DOCH !!!



  • Es lässt sich kompilieren, aber wenn ich einen Befehl an den Server sende und dann noch einen zweiten, nachdem der ausgeführt wurde hängt sich der Server auf, -1 Byte gesendet, es gibt eine Endlosschleife.

    Die Befehle sind readINI, writeINI, shutdown und exit.



  • -1 als Return Wert von send(..) bzw. recv(..) bedeutet es ist ein Fehler aufgetreten. Mit WSAGetLastError(..) kriegst Du genauere Informationen.

    Simon



  • Danke Theta werde ich mal gucken was WSAGetLastERROR ausgibt.

    Mfg Anon



  • Nur mal so ne Idee:

    Steht der erste Befeht nicht in argv[0] anstatt argv[1]?



  • Nochmamal so ne Idee:

    Du nimmst nach for(;;)... für jeden zu empfangenden Befehl ne neue Verbindung an, ohne die alte zu beenden.

    Setz mal das for(;;) im Server von Zeile 84 auf Zeile 97.



  • MisterX schrieb:

    Nochmamal so ne Idee:

    Du nimmst nach for(;;)... für jeden zu empfangenden Befehl ne neue Verbindung an, ohne die alte zu beenden.

    Setz mal das for(;;) im Server von Zeile 84 auf Zeile 97.

    for(;;)... soll natürlich

    for(;;)...
    

    heißen.



  • argv[0] ist der Pfad des Programms.
    Und das mit der Schleife werde ich ausprobieren.

    Mfg Anon



  • Das mit for(;;) in Zeile 94 funktioniert nicht, es tritt immer noch der selbe Fehler auf, nach der Änderung sieht mein Server-Code jetzt so aus:

    #include <winsock2.h>
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #pragma comment(lib, "ws2_32.lib")
    
    int main(int argc, char *argv[])
    {
    	//Strukturen*********************
    	WSADATA			wsa;
    	SOCKADDR_IN		addr;
    	SOCKET			Socket;
    	//*******************************
    
    	char exit[]     = "exit";
    	char shutdown[]	= "shutdown";
    	char readINI[]	= "readINI";
    	char writeINI[]	= "writeINI";
    
    	//Variablen**********************
    	int bytes;
    	char empfangen[1024];
    	char gesendet[1024];
    	int ret;
    	char msg[200];
    
    	//Variablen für readINI
    	char Bereichsadmin[200];
    	char admin_telefon[200];
    	char netzwerkmap[200];
    	char destination[200];
    	char Superuser[200];
    	char Superuserpasswort[200];
    	char domain[200];
    	//*******************************
    	//*******************************
    
    	//Socket bereitstellen********************************************************
    	ret = WSAStartup(MAKEWORD(2,0), &wsa);
    	if(ret != 0)
    	{
    		printf("WSA konnte nicht gestartet werden!\n");
    	}
    	else
    	{
    		printf("WSA wurde gestartet!\n");
    	}
    	//Socket starten und Fehler ggf abfangen 
    	if(Socket = socket(AF_INET, SOCK_STREAM, 0))
    	{
    		printf("Socket wurde gestartet!\n");
    	}
    	else
    	{
    		printf("Socket konnte nicht gestartet werden!\n");
    	}
    	//SOCKADDR_IN füllen 
    	addr.sin_addr.s_addr		=	INADDR_ANY;
    	addr.sin_family				=	AF_INET;
    	addr.sin_port				=	htons(1234);
    	//Socket an einen Port binden 
    	ret = bind(Socket, (SOCKADDR*)&addr, sizeof(SOCKADDR));
    	if(ret == SOCKET_ERROR)
    	{
    		printf("Server konnte nicht an Port 1234 gebunden werden!\n");
    	}
    	else
    	{
    		printf("Server wurde erfolgreich an Port 1234 gebunden!\n");
    	}
    	//An dem gbundenen Port lauschen 
    	ret = listen(Socket, 100);
    	if(ret == SOCKET_ERROR)
    	{
    		printf("Listening Mode konnte nicht gestartet werden!\n");
    	}
    	else
    	{
    		printf("Server wartet auf Verbindung!\n");
    	}
    		//Verbindungs Versuch akzeptieren
    		Socket = accept(Socket, NULL, NULL);
    		if(Socket == INVALID_SOCKET)
    		{
    			printf("Es besteht keine Verbindung mit dem Client!\n");
    		}
    		else
    		{
    			printf("Server hat eine Verbindug mit dem Client hergestellt!\n");
    		}
    	//******************************************************************************
    	for(;;)
    	{
    		bytes = recv(Socket, empfangen, sizeof(empfangen)-1, 0);
    		printf("Es wurden %d Bytes empfangen\n", bytes);
    		empfangen[bytes] = '\0';
    		printf("Daten: %s\n", empfangen);
    		//Befehle vom client 
    
    		if(strcmp(empfangen, exit) == 0)
    		{
    			return 0;
    		}
    
    		else if(strcmp(empfangen, shutdown) == 0)
    		{
    			system("shutdown -s -t 00");
    			break;
    		}
    		else if(strcmp(empfangen, writeINI) == 0)
    		{
    			//Bereichsadmin
    			bytes = recv(Socket, Bereichsadmin, sizeof(Bereichsadmin)-1, 0);
    			Bereichsadmin[bytes] = '\0';
    			printf("Es wurden %d Bytes empfangen\n", bytes);
    			printf("Daten: %s\n", Bereichsadmin);
    
    			//admin_telefon
    			bytes = recv(Socket,admin_telefon , sizeof(admin_telefon)-1, 0);
    			admin_telefon[bytes] = '\0';
    			printf("Es wurden %d Bytes empfangen\n", bytes);
    			printf("Daten: %s\n", admin_telefon);
    
    			//netzwerkmap
    			bytes = recv(Socket,netzwerkmap , sizeof(netzwerkmap)-1, 0);
    			netzwerkmap[bytes] = '\0';
    			printf("Es wurden %d Bytes empfangen\n", bytes);
    			printf("Daten: %s\n", netzwerkmap);
    
    			//destination
    			bytes = recv(Socket,destination , sizeof(destination)-1, 0);
    			destination[bytes] = '\0';
    			printf("Es wurden %d Bytes empfangen\n", bytes);
    			printf("Daten: %s\n", destination);
    
    			//Superuser
    			bytes = recv(Socket,Superuser , sizeof(Superuser)-1, 0);
    			Superuser[bytes] = '\0';
    			printf("Es wurden %d Bytes empfangen\n", bytes);
    			printf("Daten: %s\n", Superuser);
    
    			//Superuserpasswort
    			bytes = recv(Socket,Superuserpasswort , sizeof(Superuserpasswort)-1, 0);
    			Superuserpasswort[bytes] = '\0';
    			printf("Es wurden %d Bytes empfangen\n", bytes);
    			printf("Daten: %s\n", Superuserpasswort);
    
    			//domain
    			bytes = recv(Socket,domain , sizeof(domain)-1, 0);
    			domain[bytes] = '\0';
    			printf("Es wurden %d Bytes empfangen\n", bytes);
    			printf("Daten: %s\n", domain);
    
    			//INI schreiben**************************************
    			//Bereichsadmin
    			WritePrivateProfileString("Admin", "Bereichsadmin", Bereichsadmin, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini"); 
    			//admin_telefon
    			WritePrivateProfileString("Admin", "admin_telefon", admin_telefon, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			//netzwerkmap
    			WritePrivateProfileString("Backup", "netzwerkmap", netzwerkmap, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			//destination
    			WritePrivateProfileString("Backup", "destination", destination, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			//Superuser
    			WritePrivateProfileString("Backup", "Superuser", Superuser, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			//Superuserpasswort
    			WritePrivateProfileString("Backup", "Superuserpasswort", Superuserpasswort, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			//domain
    			WritePrivateProfileString("Backup", "domain", domain, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			//*****************************************************
    			strcpy(msg, "INI aktualisiert!");
    			bytes = send(Socket, msg, sizeof(msg)-1, 0);
    			printf("Es wurden %d Bytes gesendet!\n", bytes);
    		}
    		else if(strcmp(empfangen, readINI) == 0)
    		{
    			//Bereichsadmin lesen 
    			GetPrivateProfileString("Admin", "Bereichsadmin", "Konnte INI nicht lesen", Bereichsadmin, sizeof(Bereichsadmin)-1, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			bytes = send(Socket, Bereichsadmin, sizeof(Bereichsadmin)-1, 0);
    			printf("Es wurden %d Bytes gesendet!\n", bytes);
    
    			//admin_telefon lesen 
    			GetPrivateProfileString("Admin", "admin_telefon", "Konnte INI nicht lesen", admin_telefon, sizeof(admin_telefon)-1, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			bytes = send(Socket, admin_telefon, sizeof(admin_telefon)-1, 0);
    			printf("Es wurden %d Bytes gesendet!\n", bytes);
    
    			//netzwerkmap lesen
    			GetPrivateProfileString("Backup", "netzwerkmap", "Konnte INI nicht lesen", netzwerkmap, sizeof(netzwerkmap)-1, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			bytes = send(Socket, netzwerkmap, sizeof(netzwerkmap)-1, 0);
    			printf("Es wurden %d Bytes gesendet!\n", bytes);
    
    			//destination lesen 
    			GetPrivateProfileString("Backup", "destination", "Konnte INI nicht lesen", destination, sizeof(destination)-1, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			bytes = send(Socket, destination, sizeof(destination)-1, 0);
    			printf("Es wurden %d Bytes gesendet!\n", bytes);
    
    			//Superuser lesen 
    			GetPrivateProfileString("Backup", "Superuser", "Konnte INI nicht lesen", Superuser, sizeof(Superuser)-1, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			bytes = send(Socket, Superuser, sizeof(Superuser)-1, 0);
    			printf("Es wurden %d Bytes gesendet!\n", bytes);
    
    			//Superuserpasswort lesen 
    			GetPrivateProfileString("Backup", "Superuserpasswort", "Konnte INI nicht lesen", Superuserpasswort, sizeof(Superuserpasswort)-1, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			bytes = send(Socket, Superuserpasswort, sizeof(Superuserpasswort)-1, 0);
    			printf("Es wurden %d Bytes gesendet!\n", bytes);
    
    			//domain lesen 
    			GetPrivateProfileString("Backup", "domain", "Konnte INI nicht lesen", domain, sizeof(domain)-1, "C:\\Users\\kschoenfeld\\Test\\Alternativ\\Config.ini");
    			bytes = send(Socket, domain, sizeof(domain)-1, 0);
    			printf("Es wurden %d Bytes gesendet!\n", bytes);
    		}
    }
    	getchar();
    	closesocket(Socket);
    	WSACleanup();
    	return 0;
    }
    


  • In dieser Zeile steckt ein prinzipieller Fehler:

    bytes = recv(Socket, empfangen, sizeof(empfangen)-1, 0);
    

    Das Problem ist, dass nicht unbedingt alles auf einmal ankommt. Das bedeutet, dass es passieren kannst, das eine gesendete Nachricht in mehreren Teilstücken ankommt, die bei dir jeweils als eigenständige Nachricht interpretiert werden.

    Du mußt dies in einer Schleife so lange aufrufen, bis alles was gedendet wurde auch angekommen ist.
    Das ergibt ein weiteres Problem: Du mußt wissen wieviel ankommen wird.
    Dafür gibt es mehrere Möglichkeiten:

    1. Vor jedem Befehl senden, wie lang dieser ist.

    2. Jede Nachricht gleich lang machen.

    Ich glaube aber das dies nicht das Problem ist, welches den Absturz verursacht.
    (Aber es sollte auch beseitigt werden)


Anmelden zum Antworten