communication client-serveur multi-direction asynchrone par rapport à la douille ouverte?

voix
20

J'ai une application client-serveur sur lequel le client est sur un appareil Windows Mobile 6, écrit en C ++ et le serveur est Windows complet et écrit en C #.

A l'origine, je ne avais besoin d'envoyer des messages du client au serveur, avec le serveur ne jamais envoyer un accusé de réception qu'il a reçu le message. Maintenant, je voudrais le mettre à jour afin que le serveur peut effectivement envoyer un message au client aux données de demande. Comme je l'ai actuellement il mis en place afin que le client est uniquement en mode de réception après l'envoi des données au serveur, cela ne permet pas pour le serveur d'envoyer une demande à tout moment. Je dois attendre les données des clients. Ma première pensée serait de créer un autre thread sur le client avec un socket ouvert séparé, l'écoute des demandes de serveur ... tout comme le serveur a déjà en ce qui concerne le client. Est-il possible, dans le même fil et en utilisant la même prise, à tout le serveur pour envoyer des requêtes à tout moment?

Pouvez - vous utiliser quelque chose à l'effet de WaitForMultipleObjects()et passez un tampon de réception et un événement qui indique qu'il y a des données à envoyer?

Créé 04/08/2008 à 14:52
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
7

En utilisant la communication asynchrone est tout à fait possible seul fil!

Il y a un modèle de conception commune dans le développement de logiciels de réseau appelé le modèle du réacteur ( regard sur ce livre ). Certaines bibliothèque réseau bien connu fournit une implémentation de ce modèle ( regardez ACE ).

En bref, le réacteur est un objet, vous vous inscrivez à l'intérieur, et vous toutes vos prises attendez quelque chose. Si quelque chose est arrivé (nouvelles données sont arrivées, à proximité de la connexion ...) le réacteur vous informera. Et bien sûr, vous pouvez utiliser une seule prise pour envoyer et reçu des données de manière asynchrone.

Créé 17/08/2008 à 14:53
source utilisateur

voix
7

Quand je besoin d'écrire une application avec un modèle client-serveur sur lequel les clients peuvent entrer et de sortir quand ils le veulent, (je suppose que c'est aussi le cas pour votre application que vous utilisez des appareils mobiles) je me suis assuré que les clients envoient un en ligne un message au serveur, ce qui indique qu'ils sont connectés et prêts à faire tout ce dont ils avaient besoin de faire.

à ce moment le serveur peut envoyer des messages au client creux de la même connexion ouverte.

De plus, mais je ne sais pas si cela est applicable pour vous, j'ai eu une sorte de rythme cardiaque les clients envoyés au serveur, faisant savoir qu'il était encore en ligne. De cette façon , le serveur sait quand a été déconnecté de force un client du réseau et il pourrait marquer ce client de retour hors ligne.

Créé 04/08/2008 à 15:30
source utilisateur

voix
3

Consultez asio . Il est une bibliothèque C ++ croix pour asyncronous IO compatable. Je ne sais pas si cela serait utile pour le serveur (je ne l' ai jamais essayé de lier une norme C ++ DLL pour projet ac #) mais pour le client , il serait utile.

Nous l'utilisons avec notre application, et résolu la plupart de nos problèmes de concurrence IO.

Créé 11/08/2008 à 11:00
source utilisateur

voix
3

Je ne suis pas clair sur vous vouloir ajouter si oui ou non les bits asynchrones au serveur en C # ou le client en C ++.

Si vous parlez de faire cela en C ++, les plates-formes de bureau Windows peuvent faire la prise E / S de façon asynchrone par cette utilisation de l'API I / O se chevauchaient. Pour les sockets, WSASend, WSARecv permettent tous deux async I / O (lire la documentation sur leurs paramètres de lpOverlapped, que vous pouvez remplir avec des événements qui se fixent quand le E / S soit terminée).

Je ne sais pas si les plates-formes Windows Mobile prennent en charge ces fonctions, de sorte que vous pourriez avoir à faire quelques recherches supplémentaires.

Créé 05/08/2008 à 06:30
source utilisateur

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