Communication serveur-client multidirectionnelle asynchrone sur le même socket ouvert ?

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

  •  08-06-2019
  •  | 
  •  

Question

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

À l'origine, je n'en avais besoin que pour envoyer des messages du client au serveur, le serveur renvoyant uniquement un accusé de réception du message.Maintenant, je voudrais le mettre à jour afin que le serveur puisse réellement envoyer un message au client pour demander des données.Comme je l'ai actuellement configuré pour que le client ne soit en mode réception qu'après avoir envoyé des données au serveur, cela ne permet pas au serveur d'envoyer une demande à tout moment.Je devrais 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é, écoutant les requêtes du serveur... tout comme le serveur l'a déjà fait pour le client.Existe-t-il un moyen, au sein du même thread et en utilisant le même socket, d'envoyer des requêtes à tout le serveur à tout moment ?

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

Était-ce utile?

La solution

Lorsque j'ai eu besoin d'écrire une application avec un modèle client-serveur où les clients pouvaient sortir et entrer quand ils le voulaient (je suppose que c'est également le cas pour votre application puisque vous utilisez des appareils mobiles), je me suis assuré que les clients envoient un en ligne message au serveur, indiquant qu'ils étaient connectés et prêts à faire tout ce dont ils avaient besoin.

à ce moment-là, le serveur pouvait renvoyer des messages au client via la même connexion ouverte.

Aussi, mais je ne sais pas si cela s'applique à vous, j'ai eu une sorte de battement de coeur les clients envoyés au serveur, lui faisant savoir qu'il était toujours en ligne.De cette façon, le serveur sait quand un client a été déconnecté de force du réseau et peut marquer ce client comme étant hors ligne.

Autres conseils

Utiliser la communication asynchrone est tout à fait possible en monothread !

Il existe un modèle de conception courant dans le développement de logiciels de réseau appelé modèle de réacteur (regarde ce livre).Certaines bibliothèques réseau bien connues fournissent une implémentation de ce modèle (regarde ACE).

En bref, le réacteur est un objet, vous enregistrez toutes vos sockets à l'intérieur, et vous attendez quelque chose.Si quelque chose arrive (nouvelles données arrivées, connexion fermée...) le réacteur vous en informera.Et bien sûr, vous ne pouvez utiliser qu’un seul socket pour envoyer et recevoir des données de manière asynchrone.

Je ne sais pas si vous souhaitez ou non ajouter les bits asynchrones au serveur en C# ou au client en C++.

Si vous parlez de faire cela en C++, les plates-formes de bureau Windows peuvent effectuer des E/S de socket de manière asynchrone via les API qui utilisent des E/S superposées.Pour les sockets, WSASend et WSARecv autorisent tous deux les E/S asynchrones (lisez la documentation sur leurs paramètres LPOVERLAPPED, que vous pouvez remplir avec des événements qui sont définis une fois l'E/S terminée).

Je ne sais pas si les plates-formes Windows Mobile prennent en charge ces fonctions, vous devrez donc peut-être faire des recherches supplémentaires.

Vérifier asiatique.Il s'agit d'une bibliothèque C++ à compatibilité croisée pour les E/S asynchrones.Je ne sais pas si cela serait utile pour le serveur (je n'ai jamais essayé de lier une DLL c++ standard à un projet c#) mais pour le client, ce serait utile.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top