2009-10-12 10 views
6

J'apprends actuellement sur les canaux nommés dans Windows en utilisant ASP.NET 3.5 et C#. J'ai écrit un petit programme serveur qui crée un tube nommé:Un seul client peut se connecter à un canal nommé

using (NamedPipeServerStream pipeStream = new NamedPipeServerStream(pipeName)) 
{ 
    pipeStream.WaitForConnection(); 
    // do sth. 
} 

et une application cliente ouvrant la conduite comme celui-ci:

using (NamedPipeClientStream pipeStream = new NamedPipeClientStream(pipeName)) 
{ 
    pipeStream.Connect(); 
    // do sth. 
} 

Cela fonctionne très bien tant que seul client se connecte à la conduite . Il peut à la fois lire et écrire. Si je tente de connecter un second client, le code ne dépasse jamais la ligne

pipeStream.Connect(); 

Le serveur et tous les clients sont en cours d'exécution sur la même machine. Des idées?

Merci beaucoup d'avance!

Répondre

1

Merci pour l'aide rapide.

J'ai déjà traité le traitement réel dans des threads séparés mais j'ai oublié de le mentionner. Un collègue a trouvé le problème:

J'avais un StreamReader entouré par un autre bloc utilisant le bloc NamedPipeServerStream utilisant le côté serveur.

Lorsque ce bloc a terminé la fermeture de StreamReader, il a également déconnecté le NamedPipeServerStream pour une raison quelconque. De plus, je n'inclus pas pipeStream.WaitForConnection() dans une boucle.

+1

alors, vous pouvez fermer la question)) – 0100110010101

0

Un vrai tuyau (celui du magasin hardwre) a deux extrémités. Donc, je m'attendrais à ce que le tube nommé ait également exactement deux points de terminaison, un pour le processus serveur et un pour le processus client. Cependant, quelle que soit la réponse finale, je vous suggère de jeter un coup d'œil à WCF - il prend en charge la liaison de tuyauterie nette (et beaucoup d'autres comme TCP binaire, SOAP avec ou sans spécifications WS- * simplement en changeant le config) et gère l'activation du serveur et le multi-threading pour vous. .net 3.5 est disponible, donc j'opterais définitivement pour ça.