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()
Antwort
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.
* "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
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. –
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. –
- 1. Klasse vs Paket vs Modul vs Komponente vs Container vs Service vs Plattform in Java Welt
- 2. Opa vs Dart vs Haxe vs Coffee
- 3. Akkumulieren vs falten vs reduzieren vs komprimieren
- 4. body.scrollTop vs documentElement.scrollTop vs window.pagYOffset vs window.scrollY
- 5. ACE vs Boost vs Poco vs wxWidgets
- 6. Inline vs __inline vs __inline__ vs __forceinline?
- 7. Metaphon vs Levenshtein vs Soundex vs Hamming
- 8. Standort vs GeoPoint vs 1E6 vs Aufladen
- 9. VS 2013 MSTest vs nUnit vs xUnit
- 10. Exec vs ExecWait vs ExecShell vs nsExec :: Exec vs nsExec :: ExecToLog vs nsExec :: ExecToStack vs ExecDos vs ExeCmd
- 11. SpiderMonkey vs JavaScriptCore vs?
- 12. & vs * und | vs +
- 13. Bundler vs RVM vs Gems vs RubyGems vs Gemsets vs System Ruby
- 14. Mathematica: Unevaluated vs Aufschieben vs Halten vs Holdform vs HoldAllComplete vs etc etc
- 15. ScheduledExecutorService vs Timer vs Handler
- 16. HttpRequest vs HttpRequestMessage vs HttpRequestBase
- 17. pycuda vs theano vs pylearn2
- 18. Entfernungsabtastung vs Einzelscan vs Überspringungssuche
- 19. Htmlentities vs addslashes vs mysqli_real_escape_string
- 20. Xamarin vs Mono vs Monodevelop
- 21. Ansichtsfenster vs Fenster Vs Dokument
- 22. Redis vs Memcahced vs Hazelcast
- 23. java.lang.Void vs void vs Null
- 24. import vs __import __() vs importlib.import_module()?
- 25. QueryPerformanceCounter() vs QueryInterruptTime() vs KeQueryInterruptTime()
- 26. apc_define_constants vs hidef vs definieren
- 27. Zeiger vs auto_ptr vs shared_ptr
- 28. ASSERT vs. ATLASSERT vs. assert
- 29. Int vs NSNumber vs NSInteger
- 30. managedQuery() vs context.getContentResolver.query() vs android.provider.something.query()
Warum verwenden Sie IOCP überhaupt, wenn Sie synchrone E/A wünschen? – Mat
@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. –
@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