c# - Asynchrones Multi

Translate

Ich habe eine Client-Server-App, in der sich der Client auf einem Windows Mobile 6-Gerät befindet, das in C ++ geschrieben ist, und der Server sich unter Windows befindet und in C # geschrieben ist.

Ursprünglich brauchte ich es nur, um Nachrichten vom Client an den Server zu senden, wobei der Server immer nur eine Bestätigung zurücksandte, dass er die Nachricht empfangen hatte. Jetzt möchte ich es aktualisieren, damit der Server tatsächlich eine Nachricht an den Client senden kann, um Daten anzufordern. Da ich es derzeit so eingerichtet habe, dass sich der Client erst im Empfangsmodus befindet, nachdem er Daten an den Server gesendet hat, kann der Server zu keinem Zeitpunkt eine Anforderung senden. Ich müsste auf Kundendaten warten. Mein erster Gedanke wäre, einen weiteren Thread auf dem Client mit einem separaten offenen Socket zu erstellen, der auf Serveranforderungen wartet ... genau wie der Server dies bereits in Bezug auf den Client getan hat. Gibt es eine Möglichkeit, innerhalb desselben Threads und unter Verwendung desselben Sockets an alle Server zu senden, um jederzeit Anforderungen zu senden?

Können Sie etwas zur Wirkung von verwendenWaitForMultipleObjects()und ihm einen Empfangspuffer und ein Ereignis übergeben, das besagt, dass Daten gesendet werden müssen?

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Als ich eine Anwendung mit einem Client-Server-Modell schreiben musste, in das die Clients jederzeit gehen und eintreten konnten (ich gehe davon aus, dass dies auch für Ihre Anwendung gilt, wenn Sie mobile Geräte verwenden), habe ich sichergestellt, dass die Clients eine sendenonlineNachricht an den Server, die angibt, dass sie verbunden und bereit sind, alles zu tun, was sie tun müssen.

Zu diesem Zeitpunkt konnte der Server über dieselbe offene Verbindung Nachrichten an den Client zurücksenden.

Auch, aber ich weiß nicht, ob das für Sie zutrifft, ich hatte eine Art vonHerzschlagDie Clients haben an den Server gesendet und ihn wissen lassen, dass er noch online ist. Auf diese Weise weiß der Server, wann ein Client zwangsweise vom Netzwerk getrennt wurde, und kann diesen Client wieder als offline markieren.

Quelle
Translate

Die Verwendung der asynchronen Kommunikation ist in einem Thread völlig möglich!

In der Entwicklung von Netzwerksoftware gibt es ein allgemeines Entwurfsmuster, das als Reaktormuster bezeichnet wird (Schau dir dieses Buch an). Einige bekannte Netzwerkbibliotheken bieten eine Implementierung dieses Musters (Schau dir ACE an).

Kurz gesagt, der Reaktor ist ein Objekt, Sie registrieren alle Ihre Steckdosen darin und warten auf etwas. Wenn etwas passiert ist (neue Daten angekommen, Verbindung geschlossen ...), werden Sie vom Reaktor benachrichtigt. Natürlich können Sie nur einen Socket verwenden, um Daten asynchron zu senden und zu empfangen.

Quelle
Translate

Mir ist nicht klar, ob Sie die asynchronen Bits dem Server in C # oder dem Client in C ++ hinzufügen möchten oder nicht.

Wenn Sie dies in C ++ tun, können Windows-Desktopplattformen Socket-E / A asynchron über die APIs ausführen, die überlappende E / A verwenden. Für Sockets, WSASend und WSARecv ist eine asynchrone E / A zulässig (lesen Sie die Dokumentation zu den LPOVERLAPPED-Parametern, die Sie mit Ereignissen füllen können, die nach Abschluss der E / A festgelegt werden).

Ich weiß nicht, ob Windows Mobile-Plattformen diese Funktionen unterstützen, daher müssen Sie möglicherweise zusätzliche Grabungen durchführen.

Quelle
roo
Translate

Auscheckenasio. Es ist eine kreuzkompatible C ++ - Bibliothek für asynchrone E / A. Ich bin nicht sicher, ob dies für den Server nützlich wäre (ich habe noch nie versucht, eine Standard-C ++ - DLL mit einem ac # -Projekt zu verknüpfen), aber für den Client wäre es nützlich.

Wir verwenden es mit unserer Anwendung und es hat die meisten unserer Probleme mit der E / A-Parallelität gelöst.

Quelle