Asynchrone multidirektionale Server-Client-Kommunikation über denselben offenen Socket?

StackOverflow https://stackoverflow.com/questions/1241

  •  08-06-2019
  •  | 
  •  

Frage

Ich habe eine Client-Server-App, bei der sich der Client auf einem Windows Mobile 6-Gerät befindet, geschrieben in C++, und der Server auf Voll-Windows läuft 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ücksendete, dass er die Nachricht erhalten 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 nur im Empfangsmodus befindet, nachdem er Daten an den Server gesendet hat, kann der Server zu keinem Zeitpunkt eine Anfrage senden.Ich müsste auf Kundendaten warten.Mein erster Gedanke wäre, auf dem Client einen weiteren Thread mit einem separaten offenen Socket zu erstellen, der auf Serveranfragen wartet ... so wie es der Server bereits in Bezug auf den Client getan hat.Gibt es eine Möglichkeit, innerhalb desselben Threads und unter Verwendung desselben Sockets allen Servern jederzeit Anfragen zu senden?

Können Sie etwas mit dieser Wirkung verwenden? WaitForMultipleObjects() und ihm einen Empfangspuffer und ein Ereignis übergeben, das ihm mitteilt, dass Daten gesendet werden müssen?

War es hilfreich?

Lösung

Als ich eine Anwendung mit einem Client-Server-Modell schreiben musste, bei dem die Clients jederzeit ein- und ausgehen können (ich gehe davon aus, dass dies auch bei Ihrer Anwendung der Fall ist, da Sie mobile Geräte verwenden), habe ich dafür gesorgt, dass die Clients eine senden online Nachricht an den Server, die anzeigt, dass sie verbunden waren und bereit waren, alles zu tun, was sie tun mussten.

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

Auch, aber ich weiß nicht, ob das auf Sie zutrifft, ich hatte so etwas Herzschlag Die Clients sendeten eine Nachricht an den Server und teilten ihm mit, dass er noch online sei.Auf diese Weise weiß der Server, wann ein Client gewaltsam vom Netzwerk getrennt wurde, und kann diesen Client wieder als offline markieren.

Andere Tipps

Die Verwendung asynchroner Kommunikation ist in einem einzelnen Thread durchaus möglich!

In der Netzwerksoftwareentwicklung gibt es ein allgemeines Entwurfsmuster, das als Reaktormuster bezeichnet wird (Schauen Sie sich dieses Buch an).Einige bekannte Netzwerkbibliotheken bieten eine Implementierung dieses Musters (Schauen Sie sich ACE an).

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

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

Wenn Sie darüber sprechen, dies in C++ zu tun, können Desktop-Windows-Plattformen Socket-E/A asynchron über die APIs ausführen, die überlappende E/A verwenden.Für Sockets erlauben WSASend und WSARecv beide asynchrone E/A (lesen Sie die Dokumentation zu ihren LPOVERLAPPED-Parametern, die Sie mit Ereignissen füllen können, die gesetzt werden, wenn die E/A abgeschlossen ist).

Ich weiß nicht, ob Windows Mobile-Plattformen diese Funktionen unterstützen, daher müssen Sie möglicherweise etwas weiter recherchieren.

Kasse asio.Es handelt sich um eine kreuzkompatible C++-Bibliothek für asynchrone E/A.Ich bin mir nicht sicher, ob dies für den Server nützlich wäre (ich habe noch nie versucht, eine Standard-C++-DLL mit einem C#-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 E/A-Parallelitätsprobleme gelöst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top