Asynchrones Lesen/Schreiben für *ALLE* Handles?



  • Ich habe mit der Suchmaschine meiner Wahl wie auch hier im Forum nach einer Möglichkeit gesucht asynchron auf allen Handles zu lesen und zu schreiben, leider war die Suche nicht von dem Erfolg gekrönt, den ich mir erwünscht hatte.

    Das Ziel ist etwas ähnliches wie Poll/Select unter *nix systemen zu bekommen.

    Mein Ansatz sieht im Moment so aus:
    ReadFile / WriteFile mit Overlapped , das Problem, dass dann noch zu lösen ist sind HANDLEs, die auf Geräte z.B. serielle Schnittstelle, die Console oder Netzwerk zugreifen (Sie würden kein Event erzeugen, wenn weniger Daten gelesen wurden als in ReadFile angegeben).

    Der Ansatz geht hier weiter, dass ich versuche ein Zeichen zu lesen, dadurch einen Event bekommen, dass ein Zeichen gelesen wurde, wenn ich jetzt noch die tatsächlich empfangene Länge bekommen könnte wäre es super (aber bitte nicht so, dass es inkompatibel zu den anderen Handles wie Dateien wird).
    Dadurch könnte ich einen blockierenden ReadFile anstossen, der die im Puffer lagernden Daten holt.

    Über einen komplett anderen Ansatz, Links zu Doku oder Code freue ich mich auch.

    Vielen Dank,
    Bas


  • Mod

    ReadFile mit overlaped I/O kann das doch, egal ob Seriel, Pipe, oder Datei? Was ist exakt Dein Problem?



  • IO completion ports schon angesehen?
    boost.asio verwendet die auch...



  • Danke für die schnellen Antworten
    @Martin Richter
    Das Problem bei diesen Geräten (Netzwerk, Pipes etc) ist, dass man die tatsächliche Länge nicht kennt und man daher nicht genau weiß welche Länge von Daten man mit einem blocking ReadFile liesen kann, ohne dass es blockiert.

    @hustbaer
    Habe es gerade mal gesucht und bin beim überfliegen.

    funktionert ClearCommError auch bei pipes und sockets?

    Bas


  • Mod

    Wieso? Wenn Du Overlapped I/O verwendest kannst Du soundsoviele Bytes anfordern und dann bekommst Du den Event wenn diese da sind.
    Da blockiert nichts!



  • Ja, aber genau das ist mein Problem.
    Ich glaube wir reden gerade aneinander vorbei 🙂

    Ich will es mal anders formulieren:
    Ich möchte ein Event bekommen, wenn Daten gelesen wurden und zwar egal wieviele weiter möchte ich dann wissen, wieviele ich lesen kann ohne das der Aufruf (ohne OVERLAPPED) blockieren würde.

    Denn wenn ich zB auf 10 Zeichen bei der seriellen Schnittstelle warte, es aber nur 9 Zeichen ankamen bekomme ich kein Event. Das andere Extremum ist jedesmal ein Zeichen lesen, was aber auch unsinnig ist.

    Daher habe ich gedacht, dass ich ein Zeichen per OVERLAPPED lese, ein Event bekomme und die restlichen Zeichen, die schon lokal im Empfangs-Puffer liegen einlese.

    Vielen Dank für eure Hilfe,
    Bas


  • Mod

    Nein! So geht das nicht.

    Du kanst den I/O Overlapped durchführen. Dann kanst Du eine Leseanforderung stellen. Diese wird returnieren und Dir ein Event sezen wenn alle daten gelesen sind.

    Zu wiessen wieviele Daten zu lesen sind, ist die Frage Deines Protokolles!
    D.h. welche Sprache zwischen den Komponenten gesprochen wird. Die einfachste Form ist, dass jedser Request in den ersten Bytes sagt wie lang die Daten sind die folgen.



  • Also bei der seriellen Schnittstelle gibt es ja zB WaitComEvent, mit dem man auf einkommende daten warten und mit ClearComError die Anzahl der Bytes im Puffer überprüfen kann.

    Für sockets gibt es recv, mit der man alle Daten lesen kann, die schon angekommen sind.

    Gibt es solch eine Funktion wirklich nicht allgemein?


Log in to reply