2010-10-10 5 views
3

Je connais peu les pipes mais j'en ai utilisé une pour connecter deux processus dans mon code en C++ visuel. Le tuyau fonctionne bien, mais j'ai besoin d'ajouter la gestion des erreurs, donc je voulais savoir ce qui arriverait à un tuyau si le serveur qui le créait s'est écrasé et comment puis-je le reconnaître à partir du processus client?Qu'arrive-t-il à un canal nommé si le serveur tombe en panne?

Également ce qui se passera si le processus client a essayé d'accéder au même canal, après le blocage du serveur, si aucun traitement d'erreur n'est mis en place?

Edit: Quel impact sera là sur la mémoire si je continue à créer de nouveaux tuyaux (par exemple en utilisant le temps du système comme nom de pipe) alors que la précédente était cassé à cause d'un plantage du serveur? Ces tuyaux cassés seront-ils retirés de la mémoire?

+1

Notez que la meilleure façon d'ajouter une gestion des erreurs est d'examiner la documentation de toutes les fonctions que vous appelez, pour voir toutes leurs réponses possibles aux erreurs. Manipulez-les tous, peut-être en tenant compte des conditions qui causent cette erreur. Ce que vous faites, c'est penser à une condition d'erreur particulière, et découvrir quelle réponse d'erreur il provoque.Sauf si vous êtes très imaginatif, le résultat est que certaines erreurs ne seront pas gérées dans votre code. –

+0

Salut, on m'a dit de considérer un crash de serveur, et je ne sais pas ce qui arrive aux tuyaux dans un tel cas, pouvez-vous aider? – Sneha

+0

J'essaie de comprendre ce que vous entendez par "crash du serveur" Voulez-vous dire si le serveur lui-même meurt ou voulez-vous dire si votre application se bloque? – NotMe

Répondre

1

IIRC la fonction ReadFile ou WriteFile retourne FALSE et GetLastError() retournera STATUS_PIPE_DISCONNECTED

je suppose que ce genre de manipulation est mis en œuvre dans votre code, sinon vous devriez mieux ajouter ;-)

+0

Et arrivera au tuyau cassé? Sera-t-il retiré de la mémoire, au cas où je réutiliserais le même tuyau nommé? – Sneha

+0

Vous fermez votre handle sur le tuyau (poignée du client), puis essayez de vous reconnecter. Il vous indiquera alors Windows Error Code 2 (Fichier non trouvé) ou, si le serveur est démarré, il pourra se reconnecter. – Vinzenz

+0

Quel impact cela aura-t-il sur la mémoire si je continue à créer de nouveaux tuyaux, alors que le précédent a été cassé à cause d'un crash du serveur? – Sneha

1

Je veux juste jeter ça là-bas.

Si vous souhaitez une méthode survivante pour le transfert de données entre deux applications, vous pouvez envisager d'utiliser MSMQ ou même d'importer BizTalk ou une autre plate-forme de messagerie.

Il y a plusieurs choses à considérer:

  1. ce qui se passe si le serveur est redémarré ou perd de la puissance? Que se passe-t-il si l'application serveur ne répond plus? Que se passe-t-il si l'application serveur est supprimée ou disparaît complètement?
  2. Quelle est la réponse appropriée d'une application cliente dans chacune des réponses ci-dessus?

Chacun de ces contextes représente une perte potentielle de données. Si la perte de données est inacceptable, les tubes nommés ne sont pas le mécanisme que vous devriez utiliser. Au lieu de cela, vous devez persister les messages en quelque sorte. MSMQ, stocker dans une base de données, ou même tirer parti de BizTalk peut prendre en charge la survivabilité du message lui-même.

Si 1 ou 3 se produit, le canal nommé disparaît et doit être recréé par une nouvelle instance de votre application serveur. Si # 2 se produit, le canal ne disparaîtra pas jusqu'à ce que quelqu'un redémarre le serveur ou tue l'application serveur et le redémarre. Quoiqu'il en soit, l'application cliente doit gérer les problèmes mentionnés ci-dessus. Ils se résument à des problèmes de connexion. En fonction de ce que le client fait, il peut passer dans un état d'attente et le laisser pointer sur le serveur de temps en temps pour voir s'il est revenu à nouveau.

Sans connaître la nature des données et des processus de communication impliqués il est difficile de recommander une approche appropriée.

+0

Êtes-vous sûr que les MailSlots sont persistants? Peut-être que vous voulez dire MQ comme MSMQ, pas MailSlot? – user1121956

+0

@ user1121956: Wow, vous avez raison. Je voulais dire MSMQ, pas des machines à sous. Une fente de courrier est terminée et les messages non lus sont supprimés lorsque le processus propriétaire se ferme. Donc, cela n'aurait certainement pas été une bonne idée. – NotMe

Questions connexes