예제 #1
0
        private void BeginRead(IpcPipeData pd)
        {
            // Asynchronously read a request from the client
            bool isConnected = pd.pipe.IsConnected;

            if (isConnected)
            {
                try {
                    pd.pipe.BeginRead(pd.data, 0, pd.data.Length, OnAsyncMessage, pd);
                }
                catch (Exception) {
                    isConnected = false;
                }
            }

            if (!isConnected)
            {
                pd.pipe.Close();
                m_callback.OnAsyncDisconnect(pd.pipe, pd.state);
                lock (m_pipes) {
                    bool removed = m_pipes.Remove(pd.pipe);
                    Debug.Assert(removed);
                }
            }
        }
예제 #2
0
        private void OnAsyncMessage(IAsyncResult result)
        {
            // Async read from client completed
            IpcPipeData pd        = (IpcPipeData)result.AsyncState;
            Int32       bytesRead = pd.pipe.EndRead(result);

            if (bytesRead != 0)
            {
                m_callback.OnAsyncMessage(pd.pipe, pd.data, bytesRead, pd.state);
            }
            BeginRead(pd);
        }
예제 #3
0
        private void OnClientConnected(IAsyncResult result)
        {
            try
            {
                // Complete the client connection
                NamedPipeServerStream pipe = (NamedPipeServerStream)result.AsyncState;
                pipe.EndWaitForConnection(result);

                // Create client pipe structure
                IpcPipeData pd = new IpcPipeData();
                pd.pipe  = pipe;
                pd.state = null;
                pd.data  = new Byte[SERVER_IN_BUFFER_SIZE];

                // Add connection to connection list
                bool running;
                lock (m_pipes)
                {
                    running = m_running;
                    if (running)
                    {
                        m_pipes.Add(pd.pipe, pd);
                    }
                }

                // If server is still running
                if (running)
                {
                    // Prepare for next connection
                    IpcServerPipeCreate();

                    // Alert server that client connection exists
                    m_callback.OnAsyncConnect(pipe, out pd.state);

                    // Accept messages
                    BeginRead(pd);
                }
                else
                {
                    pipe.Close();
                }
            } catch (Exception ex)
            {
                //Exception reason: NamedPipeServerStream.close() is called when stopped the server. This causes OnClientConnected to be called. It then tries to acces a closed pipe with pipe.EndWaitForConnection
            }
        }
예제 #4
0
        private void OnClientConnected(IAsyncResult result)
        {
            // Complete the client connection
            NamedPipeServerStream pipe = (NamedPipeServerStream) result.AsyncState;
            pipe.EndWaitForConnection(result);

            // Create client pipe structure
            IpcPipeData pd = new IpcPipeData();
            pd.pipe     = pipe;
            pd.state    = null;
            pd.data     = new Byte[SERVER_IN_BUFFER_SIZE];

            // Add connection to connection list
            bool running;
            lock(m_pipes) {
                running = m_running;
                if (running)
                    m_pipes.Add(pd.pipe, pd);
            }

            // If server is still running
            if (running) {
                // Prepare for next connection
                IpcServerPipeCreate();

                // Alert server that client connection exists
                m_callback.OnAsyncConnect(pipe, out pd.state);

                // Accept messages
                BeginRead(pd);
            }
            else {
                pipe.Close();
            }
        }
예제 #5
0
        private void BeginRead(IpcPipeData pd)
        {
            // Asynchronously read a request from the client
            bool isConnected = pd.pipe.IsConnected;
            if (isConnected) {
                try {
                    pd.pipe.BeginRead(pd.data, 0, pd.data.Length, OnAsyncMessage, pd);
                }
                catch (Exception) {
                    isConnected = false;
                }
            }

            if (!isConnected) {
                pd.pipe.Close();
                m_callback.OnAsyncDisconnect(pd.pipe, pd.state);
                lock(m_pipes) {
                    bool removed = m_pipes.Remove(pd.pipe);
                    Debug.Assert(removed);
                }
            }
        }