2016-03-22 2 views
5

Ich verwende IOCP in meinem Client, aber ich finde es bequemer, einen blockierenden Anruf bei der Verbindung mit dem Server zu verwenden. Gibt es also ein Problem bei der Verwendung der Blockierung WSAConnect() anstelle der nicht blockierenden ConnectEx() bei der Arbeit mit IOCP?WSAConnect() vs ConnectEx()

+3

Warum verwenden Sie IOCP überhaupt, wenn Sie synchrone E/A wünschen? – Mat

+0

@Mat Wenn ich gut verstehe, kümmert sich das OP nur um den Anruf zu "verbinden", um aus Gründen der Bequemlichkeit zu blockieren. @OP Nichts hindert Sie daran, 'ConnectEx' mit einer blockierenden' Zukunft' und 'Versprechen' zu vermischen, IOCP zu verwenden, während Sie immer noch blockierendes Verhalten erhalten. –

+0

@Veronika Prüssels * "@Mat Wenn ich das gut verstehe, kümmert sich das OP nur um den Anruf, um zu blockieren, aus Gründen der Bequemlichkeit." * Ja das ist, was ich will. * "@ OP Nichts hindert Sie daran, ConnectEx mit einer blockierenden Zukunft zu vermischen und versprechen, IOCP zu verwenden, während Sie immer noch blockierendes Verhalten bekommen." * Was bedeutet das ?! – user6088487

Antwort

4

Ja, es ist völlig in Ordnung.
Ein Anruf an WSAConnect blockiert den Thread, bis eine Verbindung erstellt wurde/ein Fehler aufgetreten ist. Dann können Sie asynchrone E/A-Vorgänge ausführen und Benachrichtigungen über abgeschlossene Pakete mit Ihrer Anwendungs-IOCP erhalten. der IOCP wird keine Pakete hinsichtlich WSAConnect geben.

Ein weiterer Punkt ist, dass IOCP exculsivly mit Overlapped IO arbeitet. Wenn Ihre Funktion keinen Speicherplatz von OVERLAPPED struct (wie WSAConnect) belegt, können Sie sicher sein, dass IOCP diesen API-Aufruf nicht behandelt. Selbst wenn OVERLAPPED geliefert wird, bedeutet dies nicht, dass die Aktion asynchron ist und in der IOCP veröffentlicht wird.

möchten Sie vielleicht einen Blick auf Boost.Asio für C++ und libuv für C. der Code wird dann auch portabel sein (und weniger Buggish). Eine andere interessante Plattform ist Microsoft Casablanca, die plattformübergreifend ist, aber in meiner Erfahrung ist die Leistung katastrophal.

+0

* "auch wenn OVERLAPPED geliefert, das bedeutet nicht, dass die Aktion asynchron ist und wird in der IOCP veröffentlicht werden" * Können Sie klären, was Sie damit meinen Erklärung. Meinst du, dass ich zum Beispiel 'WSARecv() 'aufrufen und eine' OVERLAPPED' Struktur übergeben kann und kein Completion Packet erhalten kann? – user6088487

+0

zum Beispiel, 'ReadFile' und' WriteFile' erhalten 'OVERLAPPED', welche Spezies welchen Offset der Datei zu lesen beginnt. Wenn das Dateihandle für asynchrone Aktionen nicht geöffnet wurde, wird diese Aktion synchron ausgeführt. –

+0

Außerdem müssen Sie das Handle explizit dem IOCP zuordnen, um IO-Pakete zu empfangen. Also, um zu schließen, benötigen Sie die folgenden Bedingungen, um die IOCP gehen zu lassen: 1) haben Handle, die asynchrone IO unterstützen 2) verknüpfen Sie das Handle mit dem IOCP 3) verwenden Sie Funktion, die 'OVERLAPPED' Strukturen verbrauchen. Wenn eine der Bedingungen nicht zutrifft, wird IOCP nicht für diese Funktion kicken. –

Verwandte Themen