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)