Probleme mit Threads und Sockets



  • Moin Leute,
    ich bin zurzeit dabei auf C einen Socket "Server" zu programmieren, welcher am Port liest ob sich ein "Client" registriert und dann mit diesem kommunizieren kann. Soweit klappt das ganze auch.

    Jetzt blockiert natürlich mein Programm beim listen() Teil, bis sich ein Client verbindet. Um dieses Problem zu "beheben" wollte ich das ganze mit Threads realisieren und den ganzen Connect Teil in einen Thread packen und währenddessen noch andere konfigurationen vornehmen.
    Leider funktioniert das ganze überhaupt nicht.

    Ich habe proberweise zwei Threads erstellt. Der erste Thread macht nichts anderes als:
    printf("test");
    sleep(1);
    printf("test2");
    und der andere Thread ist natürlich mein socket.

    Beim Aufrufen des Programms kommt dann:
    test
    aushorchen des ports (der listen teil)

    und fertig. das zweite test wird gar nicht ausgegeben, sondern der Thread blockiert beim Listen.

    Hier mal der beteiligte Quellcode:

    void *testfunction();
    
    int main(void)
    {
        pthread_t tSocket;
        pthread_t tTest;
        pthread_create(&tTest, NULL, testfunction, NULL);
        pthread_create(&tSocket, NULL, connectSocket, NULL);
    
        pthread_exit(NULL);
    }
    
    void *testfunction()
    {
        for(;;)
        {
            printf("test");
            sleep(1);
            printf("test");
        }
       pthread_exit(NULL);
    }
    

    und dann halt der Socket, welcher etwas grösser ist. Hier der Beteiligte Code wo es blockiert:

    void *connectSocket()
    {
    ...
        printf("Aushorchen des Ports");
        errorInfo = listen(server_socket, 3);
        if(errorInfo == -1)
        {
            printf("\nEs hat kein Client sich mit dem Server verbunden.");
        }
    ...
    }
    


  • Ich tippe mal, dass Dein Programm terminiert, weil die main-Funktion zu Ende ist. Mach da mal am Ende testweise ein sleep(5000) rein.



  • pthread_join()



  • Denkst du nicht dass select() hier besser geeignet wäre?



  • @Belli Nein das Programm läuft weiterhin bzw wartet halt auf den verbindenden Client.

    @314159265358979 Gehts etwas genauer? Soweit ich weiss blockiert pthread_join() die anderen Threads bis der angegebene Thread abgearbeitet ist, nicht?

    @cooky451 Hm ich kannte select() bis eben gar nicht. Was wäre denn der vorteil von select gegenüber von threads? Bzw. kennst du eine gute Anleitung wos erklärt wird. In google werde ich mit "select" wohl eher hilfen zu datenbankanbindungen finden 😞



  • Dann suche nach select socket

    Dann findest du z.B. http://www.zotteljedi.de/socket-tipps/



  • http://msdn.microsoft.com/en-us/library/ms740141(v=vs.85).aspx
    http://www.zotteljedi.de/socket-tipps/index.html

    fd_set fdset; // fdset (siehe msdn)
    struct timeval timeout = {0, 100}; //timeval (siehe msdn)
    FD_ZERO(&fdset); //fdset wird gesäubert
    FD_SET(m_sock, &fdset); // der vorher erstellte socket m_sock wird ins set gebunden
    if (select(0, &fdset, 0, 0, &timeout) == SOCKET_ERROR)) // select blockiert bis timeout oder bis sich am socket was tut ;)
      // fehler
    if (FD_ISSET(m_sock, &fdset))
      // ok, auf dem socket ist was los
    

    Edit:
    Der Vorteil von select ist dass du eben keine Threads brauchst 😉
    Und es ist eleganter.



  • was du brauchst sind non-blocking select sockets! warum? ganz einfach performance.

    und weil ich heut so nen guten tag hab such ichs dir sogar raus 😉

    @edit: hab ich fein gemacht, gell 😮


Anmelden zum Antworten