Wie kann man das Blockieren bei Funktionen verhinder?



  • hallo leute,

    ich schreibe gerade 2 kleine Winsock Programme (server/client) die momentan nur kleine textnachrichten austauschen können. mein problem ist jetzt aber, dass soviele funtkionen, die ich verwende blockieren. zuerst hätten wie da accept(): wartet bei mir bis sich ein client meldet, dannach kann man vom server aus schreiben, der client kann nur empfangen. das Problem: wenn man während accept() etwas schreibt (kein output, soll auch so sein) und sich dann ein client verbindet, dann wird alles auf einen schlag ausgegeben (bzw. war ein '\n' enthalten wirds auch gesendet), wie kann ich die eingabe währenddessen unterbinden? dann gibts da noch die funktion std::getline(), harmoniert nicht mit send() und recv(). in der Senden/Empfangen-Schleife sowohl des Clients als auch des Servers muss immer erst etwas geschriben werden (auch wenn man nix senden will), dannach muss das gesendet werden und dann erst kann vom andern empfangen werden. Jetzt ist natürlich die Verbindung auf der anderen Seite nicht bereit zum Empfangen weil dort gerade gesendet wird oder eingelsen wird ...
    Wie kann ich also die 3 funktionen std::getline, send und recv parrallel laufen lassen? Mir würde schon fast eine Antwort wie "Geht nur mit Threads" oder so genügen aber davon hab ich leider keinen Schimmer, weshalb ich ohne versuchen wollte. Das ganze läuft übrigens unter win32, falls die info irgendjemand benötigt.

    Vielen Dank euch allen schonmal 🙂



  • Naja, ich würde ehrlich gesagt ein vernünftiges C++ Netzwerk-Framework benutzen. Du kannst natürlich dieses "Blockieren" mit Threads verhindern. Aber boost.asio http://asio.sf.net hat schon alles tippi toppi fertig. Da sind in den Tutorials sogar schon Chat-Client und Chat-Server als Mini-Beispiele bei. Auch wie man asynchrone Aufrufe macht und Callbacks werden dort auch beschrieben.

    Arbeit wird aber bei allen Varianten auf dich zu kommen. Keine Frage...



  • @ artchi: ok vielen dank erstmal, werd mir das alles jetzt mal durchlesen.

    hab mir jetzt in der zwischezeit mal boost::multithread etwas angeschaut, was etwas einsteigerfreundlicher aussieht als die normalen C-Threads. das würde doch auch klappen oder?



  • ja, boost.thread würde auch gehen.


Anmelden zum Antworten