示例#1
0
        static void TestClient(object stateInfo)
        {
            Console.WriteLine("entering TestClient");
            NamedPipeClientStream pipeClient1 =
                new NamedPipeClientStream(".", "openclmonitor_pipe",
            PipeDirection.InOut, PipeOptions.None);

            pipeClient1.Connect(5000);

            if (!pipeClient1.IsConnected)
            {
                Console.WriteLine("TestClient KO;Could not connect to pipe");
                return;
            }

            StreamString ss = new StreamString(pipeClient1);

            MonitorMessage createMsgOUT = new MonitorMessage(OpCodes.CREATE, 0, 0, "DEVICETEST");
            ss.WriteString(createMsgOUT.ToString());
            MonitorMessage createMsgIN = MonitorMessage.ParseFromString(ss.ReadString());
            Console.WriteLine("TestClient Received {0}", createMsgIN.ToString());
            pipeClient1.Close();

            NamedPipeClientStream pipeClient2 =
                new NamedPipeClientStream(".", createMsgIN.Body[0],
                PipeDirection.InOut, PipeOptions.None);

            pipeClient2.Connect(5000);

            if (!pipeClient2.IsConnected)
            {
                Console.WriteLine("TestClient KO;Could not connect to queue pipe");
                return;
            }

            ss = new StreamString(pipeClient2);

            MonitorMessage enumOUT = new MonitorMessage(OpCodes.ENUMERATE_COUNTERS, 0, 0, new string[] { "counterA", "counterB" });
            ss.WriteString(enumOUT.ToString());
            MonitorMessage enumIN = MonitorMessage.ParseFromString(ss.ReadString());
            Console.WriteLine("TestClient Received {0}", enumIN.ToString());
            StringBuilder sb = new StringBuilder();
            sb.Append("TestClient received enable counters: ");
            foreach (int cid in enumIN.BodyAsFloatArray)
            {
                sb.AppendFormat("{0}, ", cid);
            }
            Console.WriteLine(sb.ToString());

            {
                MonitorMessage mOut = new MonitorMessage(OpCodes.PERF_INIT, 0, 0);
                ss.WriteString(mOut.ToString());
                MonitorMessage mIn = MonitorMessage.ParseFromString(ss.ReadString());
                Console.WriteLine("TestClient Received {0}", mIn.ToString());
            }

            {
                MonitorMessage mOut = new MonitorMessage(OpCodes.RELEASE, 0, 0);
                ss.WriteString(mOut.ToString());
                MonitorMessage mIn = MonitorMessage.ParseFromString(ss.ReadString());
                Console.WriteLine("TestClient Received {0}", mIn.ToString());
            }

            {
                MonitorMessage mOut = new MonitorMessage(OpCodes.GET_COUNTERS, 0, 0, new float[]{1.1f, 2.2f});
                ss.WriteString(mOut.ToString());
                MonitorMessage mIn = MonitorMessage.ParseFromString(ss.ReadString());
                Console.WriteLine("TestClient Received {0}", mIn.ToString());
            }

            {
                MonitorMessage mOut = new MonitorMessage(OpCodes.END, 0, 0);
                ss.WriteString(mOut.ToString());
                MonitorMessage mIn = MonitorMessage.ParseFromString(ss.ReadString());
                Console.WriteLine("TestClient Received {0}", mIn.ToString());
            }

            pipeClient2.Close();
            Console.WriteLine("TestClient queue done");
        }
示例#2
0
        private void AsyncPipeCallback(IAsyncResult Result)
        {
            try
            {
                char[] data = new char[1024];
                pipeServer.EndWaitForConnection(Result);
                StreamReader reader = new StreamReader(pipeServer);
                StreamWriter writer = new StreamWriter(pipeServer);

                reader.ReadBlock(data, 0, 1024);
                MonitorMessage messageIN = MonitorMessage.ParseFromString(new String(data));
                Console.WriteLine("server received message " + messageIN.ToString());
                if (messageIN.As == 0 && messageIN.Body.Length>0)
                {
                    // TODO: check return code is zero
                    // create pipe name
                    string newPipeName = CreatePipeName(messageIN.Body[0]);
                    Console.WriteLine("creating pipe for device " + messageIN.Body[0]);
                    NewQueueToken token = new NewQueueToken()
                        {DeviceId=messageIN.Body[0],
                            queueName=newPipeName,
                        selectCounter = selectCounters,
                        receivedValues = receivedValues};
                    // create thread
                    ThreadPool.QueueUserWorkItem(new WaitCallback(HandleQueueThread), token);
                    if (token.semaphore.WaitOne(new TimeSpan(0, 0, 5), false))
                    {
                        // send pipe name
                        MonitorMessage messageOUT = new MonitorMessage(OpCodes.OK_MESSAGE, 0, 0, newPipeName);
                        writer.Write(messageOUT.ToString());
                        writer.Flush();
                    }
                    else
                    {
                        // timeout, aborting
                        MonitorMessage messageOUT = new MonitorMessage(OpCodes.OK_MESSAGE, 1, 0);
                        writer.Write(messageOUT.ToString());
                        writer.Flush();
                        token.abort = true;
                    }
                }
                else
                {
                    // received a message with error code
                    Console.WriteLine("return code {0}, error code {1}", messageIN.As, messageIN.Aps);
                }
                pipeServer.Disconnect();
                AsyncCallback myCallback = new AsyncCallback(AsyncPipeCallback);
                pipeServer.BeginWaitForConnection(myCallback, null);
            }
            catch (OperationCanceledException)
            {
                Console.WriteLine("Oops, exiting the thread that started the BeginWaitForConnection() on this pipe has cancelled BeginWaitForConnection().");
            }
        }