SOCKET in CreateThread übergeben



  • Hi
    Ich bin gerade dabei einen multithreaded Server in C++ zu schrieben. Verwenden tue ich hierbei Visual Studio C++ 2010 und die Windows API.
    Mit select() wird die Verbindung schön angenommen und mit CreatThread() dann an den neuen Thread übergeben. Dieser kann den Socket allerdings nicht mehr verwenden, da er den Pointer antstatt dessen Inhalt (den SOCKET) verwendet.
    Mein CreateThread()-Aufruf:

    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&handle, (LPVOID)&clients[i], 0, &dwThreadId);
    

    Und meine Thread-Methode:

    void handle(void* sock)
    {
    	SOCKET s = (SOCKET)*sock;
    	char *buf = (char*)malloc(256);
    	memset(buf,0,156);
    
    	//Recieving
    	if (recv(s,buf,256,0) == SOCKET_ERROR)
    		error("handle()->recv().");
    	OutputDebugString("Closing connection.");
    	closesocket(s);
    }
    

    Ohne den * und mit den & gehts auch nicht. ein mov per Inline-ASM ging auch nicht und beim * sagt er mir "Ungültige Dereferenzierung.".
    Ich kann mir das nicht wirklich erklären und brauche eure Hilfe. Ideen ?

    //Edit: xchg und mv ist in Inline-ASM auch nicht gegangen.



  • Was ist denn "clients"? Warum hast Du da ein "&" davor?
    Wenn "clients" global ist, dann übergeb doch einfach nur das "i", oder?



  • clients[] ist ein SOCKET-Array und ist nur lokal. Aber du hast mir grad auf die Sprünge geholfen danke :).
    Ich Trottel könnte clients[] global deklarieren und das Problem wäre gelöst :).



  • justnew schrieb:

    void handle(void* sock)
    {
    	//SOCKET s = (SOCKET)*sock;
    	SOCKET s = *(SOCKET *)sock;
    	char *buf = (char*)malloc(256);
    	memset(buf,0,156);
    
    	//Recieving
    	if (recv(s,buf,256,0) == SOCKET_ERROR)
    		error("handle()->recv().");
    	OutputDebugString("Closing connection.");
    	closesocket(s);
    }
    

    So geht es auch mit dem lokalen Array.


  • Mod

    1. Würde ich solche Strukturen nicht global deifnieren.
    2. Musst Du nur aufpassen, dass die Daten die Du per Zeigr an CreateThread übergibst auch garantiert so lange gültig sind un nicht überschrieben werden bis der Thread eine Chance hatte diese evtl. zu "kopieren" oder "zu ende zu nutzen"
    3. CreateThread solltest Du evtl. ersetzen, wenn Du schon andere CRT Funktionen nutzt.
    Siehe:
    http://blog.m-ri.de/index.php/2007/11/28/createthread-und-die-crt/



  • justnew schrieb:

    clients[] ist ein SOCKET-Array und ist nur lokal. Aber du hast mir grad auf die Sprünge geholfen danke :).
    Ich Trottel könnte clients[] global deklarieren und das Problem wäre gelöst :).

    Wenn es lokal ist, dann ist vermutlich der SOCKT schon wieder zerstört, wenn der Thread in bekommt. Du musst den SOCKET wie new erzeugen und dann dem Thread übergeben.


Log in to reply