c# - Multi asynchrone

Translate

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

À l'origine, je n'en avais besoin que pour envoyer des messages du client au serveur, le serveur ne renvoyant qu'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 client. Ma première pensée serait de créer un autre thread sur le client avec un socket ouvert séparé, en écoutant les demandes du serveur ... tout comme le serveur a déjà eu égard au client. Existe-t-il un moyen, dans le même thread et en utilisant le même socket, à tous les serveurs d'envoyer des requêtes à tout moment?

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

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Lorsque j'avais besoin d'écrire une application avec un modèle client-serveur où les clients pouvaient partir et entrer quand ils le voulaient (je suppose que c'est également le cas pour votre application lorsque vous utilisez des appareils mobiles), je me suis assuré que les clients envoient unen lignemessage 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 vous concerne, j'ai eu une sorte debattement de coeurles 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 il pourrait marquer ce client comme étant hors ligne.

La source
Translate

Utiliser la communication asynchrone est tout à fait possible en un seul thread!

Il existe un modèle de conception commun 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 (regardez ACE).

Bref, le réacteur est un objet, vous enregistrez toutes vos prises à l'intérieur, et vous attendez quelque chose. Si quelque chose se produit (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.

La source
Translate

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 Windows de bureau 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 les deux les E / S asynchrones (lisez la documentation sur leurs paramètres LPOVERLAPPED, que vous pouvez renseigner avec des événements définis lorsque les E / S sont terminées).

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.

La source
roo
Translate

Check-outasio. Il s'agit d'une bibliothèque C ++ compatible 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 ac #) mais pour le client, ce serait utile.

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

La source