Asynchronous Multi-Richtung Server-Client-Kommunikation über das gleiche offene Buchse?

stimmen
20

Ich habe eine Client-Server-Anwendung, wo der Client auf einem Windows Mobile 6-Gerät ist, in C ++ geschrieben und der Server auf vollständige Windows und in C # geschrieben.

Ursprünglich ich brauchte es nur Nachrichten vom Client an den Server zu senden, mit dem Server immer nur eine Bestätigung zurückzuschicken, dass sie die Nachricht erhalten hat. Nun würde Ich mag es zu aktualisieren, so dass der Server tatsächlich eine Nachricht an den Client-Anforderungsdaten senden kann. Da ich zur Zeit es so einrichten, die Client-Modus nur in empfangen ist, nachdem es Daten an den Server sendet, ist dies nicht für den Server erlaubt eine Anforderung jederzeit zu senden. Ich würde für die Client-Daten warten. Mein erster Gedanke wäre einen anderen Thread auf dem Client mit einem separaten offenen Socket zu erstellen, für Anfragen Server hört ... wie der Server bereits in Bezug hat das den Client. Gibt es eine Möglichkeit, innerhalb des gleichen Themas und die gleiche Buchse verwendet wird, um alle Server-Anfragen jederzeit zu schicken?

Können Sie etwas zu den Affekt verwenden WaitForMultipleObjects()und es einen Empfangspuffer und ein Ereignis übergeben , die es dort erzählt Daten gesendet werden soll?

Veröffentlicht am 04/08/2008 um 14:52
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
7

asynchrone Kommunikation zu verwenden ist durchaus möglich, in einzelnen Thread!

Es gibt ein gemeinsames Design - Muster in Netzwerk - Software - Entwicklung der Reactor (genannt Blick auf dieses Buch ). Einige bekannte Netzwerk - Bibliothek eine Implementierung dieses Musters liefert ( sehen ACE ).

Kurz gesagt ist es eine Aufgabe der Reaktor ist, registrieren Sie alle Steckdosen im Inneren, und Sie warten auf etwas. Wenn etwas passiert ist (neue Daten angekommen, Verbindung schließen ...) der Reaktor Ihnen mitteilen wird. Und natürlich können Sie nur eine Buchse zum Senden und empfangen Daten asynchron.

Beantwortet am 17/08/2008 um 14:53
quelle vom benutzer

stimmen
7

Wenn ich brauchte eine Anwendung mit einem Client-Server - Modell zu schreiben , wo die Kunden verlassen und betreten , wann immer sie wollen, (ich nehme an, das ist auch der Fall für Ihre Anwendung , wie Sie mobile Geräte verwenden) ich dafür gesorgt , dass die Kunden senden eine Online - Nachricht an den Server angibt, wurden sie verbunden und bereit , was sie tun musste , zu tun.

zu diesem Zeitpunkt könnte die Server-Nachrichten zurück an den Client senden, um die gleiche offene Verbindung Trog.

Auch, aber ich weiß nicht , ob das ist für Sie, ich hatte eine Art von Herzschlag der Clients an den Server gesendet, ließ ich weiß , dass es immer noch online war. Auf diese Weise der Server weiß , wenn ein Client mit Gewalt vom Netz getrennt wurde , und es könnte diesen Client wieder als offline markiert.

Beantwortet am 04/08/2008 um 15:30
quelle vom benutzer

stimmen
3

Schauen Sie sich Asio . Es ist ein Kreuz compatable c ++ Bibliothek für asynchrones IO. Ich bin nicht sicher , ob dies für den Server nützlich sein würde (ich habe nie versucht , ein Standard - C ++ DLL c # Projekt zu verknüpfen) , aber für die Kunden wäre es sinnvoll sein.

Wir verwenden es mit unserer Anwendung, und es löste die meisten unserer IO Concurrency Probleme.

Beantwortet am 11/08/2008 um 11:00
quelle vom benutzer

stimmen
3

Ich bin mir nicht klar, ob oder nicht Sie wollen die asynchronen Bits an den Server in C # oder den Client in C ++ hinzuzufügen.

Wenn Sie sprechen über das tun dies in C ++, Desktop-Windows-Plattformen können Buchse tun I / O asynchron durch die Verwendung dieser API überlappen E / A. Für Steckdosen, WSASend, beide WSARecv erlauben async I / O (in der Dokumentation auf ihre LpOverlapped Parameter lesen, die Sie mit Ereignissen füllen können, die eingestellt werden, wenn die E / A abgeschlossen ist).

Ich weiß nicht, ob Windows Mobile-Plattformen diese Funktionen unterstützen, so dass Sie einige zusätzliche Graben tun könnte müssen.

Beantwortet am 05/08/2008 um 06:30
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more