Named pipe qui ne veut pas rester ouvert
Salut à tous,
Sur un projet, j'essaye de mettre en œuvre un canal nommé pour pouvoir dialoguer entre 2 processus (pour l'instant), d'un coté un service windows qui sera serveur, qui fonctionne sur le compte LocalSystem en démarrage automatique, de l'autre une IHM pour l'administrer (il pourra y avoir aussi peut-être par la suite un webservice, ou un bout d'intranet comme client).
Lorsque j'essaye de communiquer je me prend une erreur "Impossible d'accéder à un canal fermé." tant coté serveur que coté client.
Code serveur :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("MonTubeNomme"))
{
while (true)
{
// Wait for a connection
pipeStream.WaitForConnection();
using (StreamReader sr = new StreamReader(pipeStream))
{
string cmd = sr.ReadLine();
switch (cmd)
{
case "#FLAG1":
string lng = sr.ReadLine();
while ((lng.ToUpper() != "#END") && (!sr.EndOfStream))
{
string key = lng.Split('§')[0];
string value = lng.Split('§')[1];
switch (key.ToUpper())
{
case "PRM1":
_param1 = value;
break;
case "PRM2":
_param2 = value;
break;
case "PRM3":
_param3 = value;
break;
}
lng = sr.ReadLine();
}
break;
case "#FLAG2":
using (StreamWriter sw = new StreamWriter(pipeStream))
{
sw.AutoFlush = true;
string tmp;
tmp = "PRM1§" + _param1 + "\n";
tmp += "PRM2§" + _param2 + "\n";
tmp += "PRM3§" + _param3 + "\n";
tmp += "#END";
sw.WriteLine(tmp);
pipeStream.WaitForPipeDrain();
}
break;
}
}
}
} |
L'erreur,systématique, arrive sur pipeStream.WaitForConnection() au second passage
Code du client :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| using (NamedPipeClientStream pipeStream = new NamedPipeClientStream("MonTubeNomme"))
{
pipeStream.Connect(10000);
using (StreamWriter sw = new StreamWriter(pipeStream))
{
sw.AutoFlush = true;
string tmp;
tmp = "#FLAG2";
sw.WriteLine(tmp);
pipeStream.WaitForPipeDrain();
}
using (StreamReader sr = new StreamReader(pipeStream))
{
string tmp;
tmp = sr.ReadLine();
while ((tmp.ToUpper() != "#END") && !sr.EndOfStream)
{
string key = tmp.Split('§')[0];
string value = tmp.Split('§')[1];
switch (key.ToUpper())
{
case "PRM1":
txtPRM1.Text = value;
break;
case "PRM2":
txtPRM2.Text = value;
break;
case "PRM3":
txtPRM3.Text = value;
break;
}
tmp = sr.ReadLine();
}
}
} |
L'erreur, pas systématique, se produit sur la 1ere ligne tmp = sr.ReadLine();