2008-08-04 12 views
20

Ich habe eine Client-Server-App, wo der Client auf einem Windows Mobile 6-Gerät ist, in C++ geschrieben und der Server ist in vollem Windows und in C# geschrieben.Asynchrone Multi-Richtung-Server-Client-Kommunikation über den gleichen offenen Socket?

Ursprünglich brauchte ich es nur, um Nachrichten vom Client an den Server zu senden, wobei der Server immer nur eine Bestätigung zurücksand, 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. Wie ich es derzeit eingerichtet habe, so dass der Client nur im Empfangsmodus ist, nachdem er Daten an den Server gesendet hat, erlaubt dies dem Server nicht, zu jeder Zeit eine Anfrage zu senden. Ich würde auf Kundendaten warten müssen. Mein erster Gedanke wäre, einen anderen Thread auf dem Client mit einem separaten offenen Socket zu erstellen, der auf Serveranforderungen lauschte ... genau wie der Server bereits in Bezug auf den Client. Gibt es einen Weg, innerhalb desselben Threads und mit dem gleichen Socket, an alle Server, um Anfragen zu senden?

Können Sie etwas mit dem Effekt von WaitForMultipleObjects() verwenden und übergeben Sie einen Empfangspuffer und ein Ereignis, das ihm sagt, dass Daten gesendet werden sollen?

Antwort

7

Wenn ich eine Anwendung mit einem Client-Server-Modell schreiben musste, wohin die Clients gehen und wann immer sie wollen, (ich nehme an, das ist auch der Fall für Ihre Anwendung, wenn Sie mobile Geräte verwenden), stellte ich sicher, dass die Clients senden Sie eine online Nachricht an den Server, um anzuzeigen, dass sie verbunden waren und bereit zu tun, was auch immer sie tun mussten.

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

Auch, aber ich weiß nicht, ob das für Sie anwendbar ist, hatte ich eine Art Herzschlag die Clients an den Server gesendet, lassen Sie es wissen, dass es noch online war. Auf diese Weise weiß der Server, wann ein Client zwangsweise vom Netzwerk getrennt wurde, und er konnte diesen Client als offline markieren.

3

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

Wenn Sie dies in C++ tun, können Desktop-Windows-Plattformen asynchrone Socket-E/A ü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 der E/A abgeschlossen ist).

Ich weiß nicht, ob Windows Mobile-Plattformen diese Funktionen unterstützen, also müssen Sie eventuell noch etwas graben.

3

Auschecken asio. Es ist eine Cross-kompatible C++ - Bibliothek für asynchrone IO. Ich bin nicht sicher, ob dies für den Server nützlich wäre (ich habe 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 löste die meisten unserer IO-Nebenläufigkeitsprobleme.

7

Eine asynchrone Kommunikation ist in einem Thread möglich!

Es gibt ein allgemeines Entwurfsmuster in der Netzwerksoftwareentwicklung, das als das Reaktormuster (look at this book) bezeichnet wird. Eine bekannte Netzwerkbibliothek stellt eine Implementierung dieses Musters bereit (look at ACE).

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