Asynchronischer Verkehr mit mehreren Sockets.



  • Hi,

    Ich suche seit längerem eine Möglichkeit auf Antworten über mehreren Sockets zu warten. Das heißt ich würde gerne auf Overlapped I/O zurückgreifen.

    Die Situation ist die Folgende:
    -Ich starte einen Thread der auf ein oder mehrere Ereignisse wartet.
    -Ich sende eine Art Ping-packet über mehrere Verbindungen an einem Stück ohne auf eine Antwort zu warten.
    -Der Thread soll die nun Echos der User auffangen und überprüfen welcher User kein Echo gesendet hat.

    Leider hat WSAOVERLAPPED nur ein einziges Event Handle und nicht mehrere.
    Kann mir jemand weiterhelfen?



  • Falsches Forum: korrekt wäre WinAPI



  • Guck dir doch mal Boost.Asio an (kann auch ohne Boost verwendet werden).
    Da gibts die Möglichkeit für asynchrone Operationen.

    Simon



  • BTW:

    Leider hat WSAOVERLAPPED nur ein einziges Event Handle und nicht mehrere.
    Kann mir jemand weiterhelfen?

    Mach ein Array aus den Events und benutze WaitForMultipleObjects(..).
    Aber wie gesagt, das ist eine von vielen Möglichkeiten und ich würde Boost.Asio od. eine andere Library vorziehen.

    Simon



  • hmm naja das Overlapped->hEvent auch ein pointer auf einen array sein kann weiß ich. Aber z.B. WSASendMsg hat keine wirkliche möglichkeit zu spezifizieren welches element im array der struktur für den call benutzt werden soll. Das heißt ich kann zwar 20 events einbinden aber bei den bezüglichen api's (WSASend/RecvTo/From/Msg) kann ich keine angaben bezüglich des array offsets machen. Ich gehe davon aus das es immer das erste element benutzen wird.



  • Nimm WSAWaitForMultipleEvents(). Die Funktion gibt einen Offset zurück, von dem du dann noch WSA_WAIT_EVENT_0 ab und du hast den Index für das Array.

    Für beste Performance empfehle ich jedoch I/O-Completionports.



  • Ich spreche von den WSASend und WSARecv calls. Diese scheinen keine möglichkeit bereitzustellen ein bestimmtes offset im event array anzugeben.



  • Das Event-Modell ist auch denkbar schlecht, da du damit nur maximal 64 Verbindungen gleichzeitig überwachen kannst.



  • Ad aCTa schrieb:

    Das Event-Modell ist auch denkbar schlecht, da du damit nur maximal 64 Verbindungen gleichzeitig überwachen kannst.

    Ja, ich erinnere mich. Das war doof. Die I/O-Completionports haben diese Beschränkung nicht und ich kann (wenns mal dumm kommt) auf tausende warten?



  • und wie würde ein konzept mit competion ports aussehen?



  • > und ich kann (wenns mal dumm kommt) auf tausende warten?

    Ist de facto egal, auf wie viele du wartest. Es kommt drauf an, wer wartet, und das sind ein paar Threads aus dem Pool. Es ist einfach eine Frage der Skalierbarkeit. Und wenn der Server mit 64 Clients ausgelastet ist, aber wesentlich mehr hat, ist das einfach nicht okay. 🙂



  • Ich würde Boost.Asio anschauen, die Impl. unter Windows verwendet IOCP.
    Simon


Log in to reply