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 :L'erreur,systématique, arrive sur pipeStream.WaitForConnection() au second passage
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } } } }
Code du client :L'erreur, pas systématique, se produit sur la 1ere ligne tmp = sr.ReadLine();
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); } } }
Partager