Absturz bei CreateThread()?



  • Hallo Leute

    Mein Problem wäre, dass der Thread, den ich mit CreateThread aufrufe nach dem Ausführen abstürzt und das ganze Programm mit in den Tod nimmt.

    #include <windows.h>
    #include <process.h>
    #include <winsock2.h> 
    #include <iostream.h>   
    
    SOCKET chat(SOCKET client);
    
    int main()
    {	
        cout << "Starting up TCP server\r\n";
        HANDLE hThread[512];
        DWORD dwID[512];
        DWORD dwRetVal = 0;
    
        SOCKET server;
    
        WSADATA wsaData;
    
        sockaddr_in local;
    
        int wsaret=WSAStartup(0x101,&wsaData);
    
        if(wsaret!=0)
        {
            cout << "Wrong Winsock Version.\n";
            return 0;
        }
    
        local.sin_family=AF_INET;
        local.sin_addr.s_addr=INADDR_ANY;
        local.sin_port=htons((u_short)20248);
    
        server=socket(AF_INET,SOCK_STREAM,0);
    
        if(server==INVALID_SOCKET)
        {
            return 0;//_endthread();
        }
    
        if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
        {
            return 0;
        }
    
        if(listen(server,10)!=0)
        {
            return 0;
        }
    
        SOCKET client;
        sockaddr_in from;
        int fromlen=sizeof(from);
    
        while(true)
        {
            char temp[512];
            char input[512];
    
            client=accept(server,
                (struct sockaddr*)&from,&fromlen);
    
            cout << "Connection from " << inet_ntoa(from.sin_addr) <<"\n";
    
            hThread[0] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)chat(client),0,0,&dwID[0]);
        }
    
        closesocket(server);
    
        WSACleanup();
    }
    
    SOCKET chat(SOCKET client)
    {
         char input[512];
         //SOCKET s = (SOCKET) client;
         cout << "Enter new Message to send:\n";
         cin >> input;
         send(client,input,strlen(input),0);
         closesocket(client);
         return client;
    }
    

    Weiss jemand, wo der Fehler liegt?

    Gruss 3-R4Z0R



  • der fehler liegt hier:

    (LPTHREAD_START_ROUTINE)chat(client)



  • und hier:

    SOCKET chat(SOCKET client)



  • hinweis schrieb:

    der fehler liegt hier:

    (LPTHREAD_START_ROUTINE)chat(client)

    Was soll man denn da anderes reintun, anstatt LPTHREAD_START_ROUTINE ?

    hinweis schrieb:

    und hier:

    SOCKET chat(SOCKET client)

    Da sollte eigentlich alles funktionieren. Der Thread wird ja auch gestartet, nur wenn er durchgearbeitet worden ist, dann stürzt der ab. Wenn ich SOCKET durch DWORD ersetze hilfts auch nicht.

    GreetZZ 3-R4Z0R



  • ne du rufst die funktion einfach nur auf durch das "chat(client)" auf. den rückgabewert, also ein socket, übergibst du dann an CreateThread als startadresse. 🤡 die funktion wird aber nicht als thread gestartet! guck dir einfach mal ein beispiel in der msdn an!



  • Soweit stürzt das ganze nichtmehr ab. Jedoch kann ich einen SOCKET als Parameter nicht weitergeben.

    Weiss da jemand irgendwas?

    GreetZZ 3-R4Z0R



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Vllt. eine Funktion machen, welche den Socket entgegennimmt und diese Funktion im Thread aufrufen lassen? Mache ich genuso und klappt wunderbar...



  • Ominion|off schrieb:

    Vllt. eine Funktion machen, welche den Socket entgegennimmt und diese Funktion im Thread aufrufen lassen? Mache ich genuso und klappt wunderbar...

    Habs jetzt geschafft:
    Ich übergebe als Parameter einfach einen Zeiger auf den SOCKET. Geht jetzt wunderbar.

    GreetZZ 3-R4Z0R



  • wie hast du es denn vorher gemacht?



  • Ominion|off schrieb:

    wie hast du es denn vorher gemacht?

    Den SOCKET selber als Parameter übergeben.



  • DWORD WINAPI chat(void* lpParameter)
    {
    	SOCKET s = *(SOCKET*)lpParameter;
    	return 0;
    }
    
    CreateThread(NULL, 0, chat, (void*)&s, 0, &dwID[0]);
    

Anmelden zum Antworten