non blocking listen() oder Multithreading



  • hiho,

    ich wollte mich mal an einem kleinen ChatServer versuchen.
    Bisher habe ich allerdings mehr mit der Windows-API und den dazugehörigen Sockets usw. gearbeitet.

    Der Server soll permanent listen-en und gleichzeitig von bereits connecteten Clients Nachrichten empfangen und diese an alle Clients broadcasten.

    Ich sehe hier zwei Möglichkeiten:

    (1)
    Pseudocode:

    while (true)
    {
        int connection = ListenForConnections(s, backlog, timeout);
        if (connection <= -1)
            ExitBecauseOfBadFailure();
        if (connection == 0)
            AcceptConnection();
        ReceiveAndBroadcastMessages();
    }
    

    also praktisch würde hier ListenForConnections bei erreichen des Timeouts einen positiven Wert zurückgeben,
    wodurch das Programm 1. weiß, dass kein Client sich verbinden möchte und 2. auch kein Fehler aufgetreten ist.

    Allerdings weiß ich nicht, ob diese Möglichkeit überhaupt realisierbar ist.

    (2)
    ich werfe die listen und accept Funktionalität in einen eigenständigen Thread.
    Um recv, send und client-seitige Disconnects kümmert sich das Hauptprogramm.

    Leider habe ich mit Threads unter Linux noch weniger zu tun gehabt als mit Sockets. Daher wüsste ich jetzt nicht einmal wonach ich suchen sollte 😉

    Ich würde mich riesig freuen, wenn Ihr mir sagen könnt ob und wie ich (1) umsetzen kann (in etwa) und wenn nicht, vllt ein paar Stichworte zu Multithreading,
    damit ich einen Ansatz habe 😃

    Danke, Drako



  • Schau dir mal das an http://beej.us/guide/bgnet/

    Da gibts ein tolles Tutorial -(hab Netzwerkprogrammierung auch danach
    gelernt und schon einige Anwendungen geschrieben). Ist echt locker
    und trotzdem gut gemacht - ein Chatserver-Muster ist da auch dabei....

    Ich bin Weidechef - ich darf das - IP-Pakete schicken...



  • http://www.zotteljedi.de/socket-tipps/ ist auch sehr zu empfehlen

    aber mal zu dem problem, das ganze ist ohne weiteres ohne threads zu realisieren und sollte auch ohne gehandhabt werden,
    entscheidend dafür ist der einsatz von select() http://linux.die.net/man/2/select

    zetteljedi hat zu der funktion nen ausgiebiges kapitel



  • Unter Linux verwendet man kein select mehr. Es gibt das viel tollere epoll.



  • Also erstmal danke für die schnellen Antworten.

    Ich werde mir das mal alles durchlesen und mal schauen, ob ichs damit hinbekomm 😉

    PS.: lol, mir ist gerade bewusst geworden, dass listen gar nicht blockt, sondern accept xD
    das löst natürlich das Problem^^


Anmelden zum Antworten