Threading



  • Das kann schon gut sein, das er dafür nicht "reif" genug ist, aber wie soll den etwas wachsen wenn du ihm so eine schlechte antwort gibst? wahrscheinlich hast du keine ahnung.



  • Hallo man sollte _beginthreadex benutzen und nicht CreateThread.



  • du hast zwei moeglichkeiten:
    A: mysocket machst du zu einer globalen variable

    B: Die Funktion die parallel ausgefuehrt werden soll ( in deinem Fall: ThreadProc ) kann genau einen parameter haben und dieser ist ein int oder ein pointer also 4 byte lang. SOCKET ist auch 4 byte lang also kannst du direkt deinen mysocket uebergeben oder aber du nutzt diese 4 byte als pointer und laesst ihn auf deinen mysock zeigen. Musst halt dann dafuer sorgen das mysocket gueltig ist wenn recv() drauf zu greifen will



  • Vielen Dank!
    Deine Hilfe hat mir sehr geholfen!



  • Ich habe ein ähnliches Problem.

    Ich starte den Thread ebenso wie anfänger 😕 mit CreateThread und rufe eine Funktion, welche für den Empfang der Daten zuständig ist.

    Hat sich mein Client mit dem Server verbunden was auch geht, haben beide die Möglichkeit Daten zu senden bzw. Text.
    Der Thread müsste doch immer die Daten ausgeben die empfangen wurden oder? So habe ich das implementiert. Ich meine er läuft doch im Hintergrund?
    Ich hoffe das ist nicht allzu ungenau. Gebe euch natürlich gerne alle Infos die ihr benötigt.

    Vielen Dank!



  • Hier ist der Server:

    #include <stdio.h>
    #include <winsock2.h>
    #include <iostream>
    using namespace std;
    #pragma comment( lib, "ws2_32.lib" )
    using namespace std;
    //#include <process.h> nur für benginthread(ex) benötigt
    SOCKET acceptSocket;
    
    DWORD WINAPI ThreadProc() 
    { 
    for(;;)
    {
    char recBuf[256];
    int receive;
    
    receive = recv(acceptSocket, recBuf, sizeof(recBuf), NULL);
    cout << "" << endl;
    
    return 0;
    } //for
    }
    
    int StartWinsock()
    {
    	;
    	WSAData wsaData;
    	WORD wVersion = MAKEWORD(2,0);
    	return WSAStartup(wVersion, &wsaData);
    }
    
    int main()
    
    {
    int retStartup;
    retStartup = StartWinsock();
    if(retStartup!=0)
    {
    	cout << "Error WSAStartup: " << WSAGetLastError() << endl;
    }
    
    SOCKET mysocket; //Basic
     //Verbindungsannahme, wartet nur auf Verbindungen mehr nicht
    
    mysocket = socket(AF_INET,SOCK_STREAM,0);
    
    SOCKADDR_IN addr;
    
    char ServerAdress[] = "127.0.0.1";
    memset(&addr,0,sizeof(SOCKADDR_IN));
    addr.sin_family = AF_INET; // Adress Familie
    addr.sin_port = htons(12345); // Socket an Port 12345 binden
    addr.sin_addr.s_addr = inet_addr(ServerAdress); 
    
    bind(mysocket, (SOCKADDR*)&addr, sizeof(addr));
    
    listen(mysocket, SOMAXCONN);
    
    int addrlen = sizeof addr;
    
    cout << "Mein simpler Chat, Version 1.0" << endl;
    cout << "***   Matthias Heil 2005   ***" << endl;
    cout << "Waitung for incoming connection... " << endl;
    
    acceptSocket = accept(mysocket, NULL,NULL);
    
    if(acceptSocket != SOCKET_ERROR)
    {
    	cout << "Client connected" << endl;
    }
    
    CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadProc, NULL, 0, NULL);
    
    for(;;)
    {
    char message[256];
    cout << "Enter Message to send:";
    cin.getline(message, 256);
    sendto( acceptSocket, message, sizeof(message)+1, 0, NULL, NULL);
    
    } //for
    
    return(0);
    }
    


  • Hier ist der Client:

    #include <iostream>
    #include <stdio.h>
    #include <winsock2.h>
    using namespace std;
    
    #define SERVER_PORT 12345
    
    SOCKET sock; //Global!!!
    
    DWORD WINAPI ThreadProc() 
    { 
    for(;;)
    {
    
    char incoming[256];
    
    recv(sock, incoming, sizeof(incoming),NULL);
    cout << "" << endl;
    cout << "Incoming: " << incoming << endl;
    return 0;
    } //for
    }
    
    long go() // Socket-Service starten (unter Windows erforderlich).
    {
    long rc;
    WSADATA wsaData; // WSADATA-Objekt erstellen.
    WORD wVersionRequested;
    wVersionRequested = MAKEWORD(2,1); // zu Verwendene Version: 2.1.
    								   // mit MAKEWORD-Makro WORD-Wert erstellen
    rc = WSAStartup(wVersionRequested, &wsaData); // WSAStartup aufrufen
    return rc;
    /*
    siehe:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/wsastartup_2.asp
    */
    } 
    
    void main()
    {
    
    SOCKADDR_IN addr;
    //long rc;
    char hostAdress[] = "127.0.0.1";
    
    //WSAStartup aufrufen
    go();
    
    //Socket anlegen
    
    sock=socket(AF_INET,SOCK_STREAM,NULL);
    
    // Informationen fuer Verbindung
    addr.sin_family = AF_INET;
    addr.sin_port = htons(SERVER_PORT);
    addr.sin_addr.s_addr = inet_addr(hostAdress);
    
    //Socket mit Server verbinden, endlos immer wieder probieren
    while(connect(sock, (SOCKADDR*)&addr, sizeof(SOCKADDR)) == SOCKET_ERROR)
    {
    printf("."); // Lebenszeichen ausgeben
    Sleep( 500 ); // 500ms warten
    }
    
    // Wenn Server gefunden...
    printf("Verbunden");
    cout << "" << endl;
    
    CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadProc, NULL, NULL, NULL);
    
    for(;;)
    {
    char message[256];
    cout << "Enter Text to send: ";
    cin.getline(message, 255);
    //sprintf(message, "Hi I am the client!!!");
    
    sendto( sock, message, sizeof(message)+1, 0, NULL, NULL);
    
    }
    }
    


  • Wenn dein Programm die C-Runtime verwendet solltest du CreateThread() durch _beginthreadex() ersetzen sonst könnte es zu Problemen kommen.



  • Mach erstmal den (LPTHREAD_START_ROUTINE)-Cast weg. Ist unnötig wenn die Threadfunktion die richtige Signatur hat. 🤡

    Ok, hilft aber alles nix beim deinem Problem.



  • Chew-Z schrieb:

    Wenn dein Programm die C-Runtime verwendet solltest du CreateThread() durch _beginthreadex() ersetzen sonst könnte es zu Problemen kommen.

    Ja dazu is dann <process.h> erforderlich. Denkst du echt das es daran liegt?
    Ist die sonst nichts aufegefallen?


Anmelden zum Antworten