天天看点

采用管道进行通讯的例子

作者:肖波

    用Remoting做进程间通讯,效率较低,于是做了一个采用管道技术进行进程间通讯的例子,在1.8G 双核计算机上每秒钟可以发送180M数据。下面给出源码

    Server端的管道类

采用管道进行通讯的例子

using System;

采用管道进行通讯的例子

using System.Collections.Generic;

采用管道进行通讯的例子

using System.Text;

采用管道进行通讯的例子

using System.Threading;

采用管道进行通讯的例子

using Pipe.Win32;

采用管道进行通讯的例子
采用管道进行通讯的例子

namespace Pipe.Server

采用管道进行通讯的例子

{

采用管道进行通讯的例子

    public delegate void ReceiveMessageFunc(System.IO.MemoryStream m);

采用管道进行通讯的例子

    public delegate void ReceiveMessageErrorFunc(Exception e);

采用管道进行通讯的例子
采用管道进行通讯的例子

    public class PipeServer : IDisposable

采用管道进行通讯的例子

    {

采用管道进行通讯的例子

        enum State

采用管道进行通讯的例子

        {

采用管道进行通讯的例子

            Idle = 0,

采用管道进行通讯的例子

            Begining = 1,

采用管道进行通讯的例子

            Reading = 2,

采用管道进行通讯的例子

        }

采用管道进行通讯的例子
采用管道进行通讯的例子

        String m_PipeName;

采用管道进行通讯的例子

        uint m_Handle;

采用管道进行通讯的例子

        uint m_BufferSize;

采用管道进行通讯的例子

        State m_State = State.Idle;

采用管道进行通讯的例子
采用管道进行通讯的例子

        const ulong SYNC_HEAD = 0xf8c7a1ca13db307e;

采用管道进行通讯的例子

        const uint NMPWAIT_USE_DEFAULT_WAIT = 0x00000000;

采用管道进行通讯的例子

        const int DEFAULT_BUFFER_SIZE = 1024;

采用管道进行通讯的例子
采用管道进行通讯的例子

        ReceiveMessageFunc m_ReceiveMessage;

采用管道进行通讯的例子

        ReceiveMessageErrorFunc m_ReceiveMessageError;

采用管道进行通讯的例子
采用管道进行通讯的例子

        public ReceiveMessageFunc OnReceiveMessage

采用管道进行通讯的例子
采用管道进行通讯的例子

            get

采用管道进行通讯的例子

            {

采用管道进行通讯的例子

                return m_ReceiveMessage;

采用管道进行通讯的例子

            }

采用管道进行通讯的例子
采用管道进行通讯的例子

            set

采用管道进行通讯的例子
采用管道进行通讯的例子

                m_ReceiveMessage = value;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public ReceiveMessageErrorFunc OnReceiveMessageError

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                return m_ReceiveMessageError;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                m_ReceiveMessageError = value;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public String PipeName

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                return m_PipeName;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public uint BufferSize

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                return m_BufferSize;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public String PipeUri

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                return @"\\.\pipe\" + m_PipeName;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        private bool IsSyncHead(byte[] buf, uint len, out int msgLen)

采用管道进行通讯的例子
采用管道进行通讯的例子

            msgLen = 0;

采用管道进行通讯的例子
采用管道进行通讯的例子

            if (len != 12)

采用管道进行通讯的例子
采用管道进行通讯的例子

                return false;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

            if (SYNC_HEAD != BitConverter.ToUInt64(buf, 0))

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

            msgLen = BitConverter.ToInt32(buf, sizeof(ulong));

采用管道进行通讯的例子
采用管道进行通讯的例子

            if (msgLen < 0)

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

            return true;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        private void ProcessMessage(System.IO.MemoryStream m)

采用管道进行通讯的例子
采用管道进行通讯的例子

            if (OnReceiveMessage != null)

采用管道进行通讯的例子
采用管道进行通讯的例子

                m.Position = 0;

采用管道进行通讯的例子

                OnReceiveMessage(m);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        private void ThreadProc()

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public PipeServer(String pipeName)

采用管道进行通讯的例子
采用管道进行通讯的例子

            m_PipeName = pipeName;

采用管道进行通讯的例子

            m_BufferSize = DEFAULT_BUFFER_SIZE;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public PipeServer(String pipeName, uint bufferSize)

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

            m_BufferSize = bufferSize;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public void Listen()

采用管道进行通讯的例子
采用管道进行通讯的例子

            while (true)

采用管道进行通讯的例子
采用管道进行通讯的例子

                try

采用管道进行通讯的例子

                {

采用管道进行通讯的例子
采用管道进行通讯的例子

                    m_Handle = NTKernel.CreateNamedPipe(PipeUri, (uint)FileAccess.PIPE_ACCESS_DUPLEX,

采用管道进行通讯的例子

                        (uint)PipeMode.PIPE_READMODE_MESSAGE | (uint)PipeMode.PIPE_TYPE_MESSAGE | (uint)PipeMode.PIPE_WAIT,

采用管道进行通讯的例子

                        NTKernel.PIPE_UNLIMITED_INSTANCES, m_BufferSize, m_BufferSize, NMPWAIT_USE_DEFAULT_WAIT, new SecurityAttributes());

采用管道进行通讯的例子
采用管道进行通讯的例子

                    if (m_Handle == NTKernel.INVAILD_HANDLE)

采用管道进行通讯的例子

                    {

采用管道进行通讯的例子

                        throw new Exception(String.Format("CreateNamedPipe fail, err={0}", NTKernel.GetLastError()));

采用管道进行通讯的例子

                    }

采用管道进行通讯的例子
采用管道进行通讯的例子

                    if (!NTKernel.ConnectNamedPipe(m_Handle, IntPtr.Zero))

采用管道进行通讯的例子
采用管道进行通讯的例子

                        uint err = NTKernel.GetLastError();

采用管道进行通讯的例子

                        NTKernel.CloseHandle(m_Handle);

采用管道进行通讯的例子

                        throw new Exception(String.Format("ConnectNamedPipe fail, err={0}", err));

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                    byte[] buf = new byte[m_BufferSize];

采用管道进行通讯的例子
采用管道进行通讯的例子

                    uint relSize = 0;

采用管道进行通讯的例子

                    int msgLen = 0;

采用管道进行通讯的例子

                    int offset = 0;

采用管道进行通讯的例子

                    System.IO.MemoryStream m = new System.IO.MemoryStream();

采用管道进行通讯的例子
采用管道进行通讯的例子

                    while (NTKernel.ReadFile(m_Handle, buf, m_BufferSize, out relSize, IntPtr.Zero))

采用管道进行通讯的例子
采用管道进行通讯的例子

                        switch (m_State)

采用管道进行通讯的例子

                        {

采用管道进行通讯的例子

                            case State.Idle:

采用管道进行通讯的例子

                                if (IsSyncHead(buf, relSize, out msgLen))

采用管道进行通讯的例子

                                {

采用管道进行通讯的例子

                                    m_State = State.Begining;

采用管道进行通讯的例子

                                }

采用管道进行通讯的例子
采用管道进行通讯的例子

                                break;

采用管道进行通讯的例子

                            case State.Begining:

采用管道进行通讯的例子

                                offset = 0;

采用管道进行通讯的例子

                                m = new System.IO.MemoryStream();

采用管道进行通讯的例子

                                m.Write(buf, 0, (int)relSize);

采用管道进行通讯的例子

                                offset += (int)relSize;

采用管道进行通讯的例子

                                if (offset >= msgLen)

采用管道进行通讯的例子
采用管道进行通讯的例子

                                    m_State = State.Idle;

采用管道进行通讯的例子
采用管道进行通讯的例子

                                    if (offset == msgLen)

采用管道进行通讯的例子

                                    {

采用管道进行通讯的例子

                                        ProcessMessage(m);

采用管道进行通讯的例子

                                    }

采用管道进行通讯的例子

                                    else

采用管道进行通讯的例子
采用管道进行通讯的例子

                                        if (OnReceiveMessageError != null)

采用管道进行通讯的例子

                                        {

采用管道进行通讯的例子

                                            OnReceiveMessageError(new Exception("Message overflow!"));

采用管道进行通讯的例子

                                        }

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                                else

采用管道进行通讯的例子
采用管道进行通讯的例子

                                    m_State = State.Reading;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                            case State.Reading:

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                        }

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                    NTKernel.DisconnectNamedPipe(m_Handle);

采用管道进行通讯的例子

                    NTKernel.CloseHandle(m_Handle);

采用管道进行通讯的例子

                    System.Threading.Thread.Sleep(10);

采用管道进行通讯的例子

                }

采用管道进行通讯的例子

                catch (Exception e)

采用管道进行通讯的例子
采用管道进行通讯的例子

                    if (OnReceiveMessageError != null)

采用管道进行通讯的例子
采用管道进行通讯的例子

                        OnReceiveMessageError(e);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public void Dispose()

采用管道进行通讯的例子
采用管道进行通讯的例子

            lock (this)

采用管道进行通讯的例子
采用管道进行通讯的例子

                if (m_Handle != NTKernel.INVAILD_HANDLE)

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                    m_Handle = NTKernel.INVAILD_HANDLE;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        ~PipeServer()

采用管道进行通讯的例子
采用管道进行通讯的例子

            Dispose();

采用管道进行通讯的例子
采用管道进行通讯的例子

    }

采用管道进行通讯的例子
采用管道进行通讯的例子

}

采用管道进行通讯的例子

Client 端的管道类

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

using System.Diagnostics;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

namespace Pipe.Client

采用管道进行通讯的例子
采用管道进行通讯的例子

    public class PipeClient : IDisposable

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        String m_ComputerName;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        byte[] m_SendBuf;

采用管道进行通讯的例子
采用管道进行通讯的例子

        Propertys

采用管道进行通讯的例子
采用管道进行通讯的例子

        private void Connect()

采用管道进行通讯的例子
采用管道进行通讯的例子

            int file_not_find_times = 0;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                m_Handle = NTKernel.CreateFile(PipeUri, (uint)FileAccess.GENERIC_READ | (uint)FileAccess.GENERIC_WRITE,

采用管道进行通讯的例子

                    0, new SecurityAttributes(), (uint)CreateMode.OPEN_EXISTING, 0, 0);

采用管道进行通讯的例子
采用管道进行通讯的例子

                if (m_Handle == NTKernel.INVAILD_HANDLE)

采用管道进行通讯的例子
采用管道进行通讯的例子

                    uint err = NTKernel.GetLastError();

采用管道进行通讯的例子
采用管道进行通讯的例子

                    if (err == NTKernel.ERROR_FILE_NOT_FOUND)

采用管道进行通讯的例子
采用管道进行通讯的例子

                        if (file_not_find_times++ < 2000)

采用管道进行通讯的例子
采用管道进行通讯的例子

                            System.Threading.Thread.Sleep(20);

采用管道进行通讯的例子

                            continue;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                    if (err == NTKernel.ERROR_PIPE_BUSY)

采用管道进行通讯的例子
采用管道进行通讯的例子

                        NTKernel.WaitNamedPipeA(PipeUri, 20);

采用管道进行通讯的例子

                        continue;

采用管道进行通讯的例子
采用管道进行通讯的例子

                    else

采用管道进行通讯的例子
采用管道进行通讯的例子

                        throw new Exception(String.Format("Create File for pipe fail, err={0}", NTKernel.GetLastError()));

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                break;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        private void WriteBuf(byte[] buf)

采用管道进行通讯的例子
采用管道进行通讯的例子

            uint relSize;

采用管道进行通讯的例子
采用管道进行通讯的例子

            if (!NTKernel.WriteFile(m_Handle, buf, (uint)buf.Length, out relSize, IntPtr.Zero))

采用管道进行通讯的例子
采用管道进行通讯的例子

                throw new Exception(String.Format("Send message to pipe fail, err={0}", NTKernel.GetLastError()));

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public void Close()

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                    bool ret = NTKernel.CloseHandle(m_Handle);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public PipeClient(String pipeName, uint bufferSize)

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

            m_Handle = NTKernel.INVAILD_HANDLE;

采用管道进行通讯的例子

            m_SendBuf = new byte[bufferSize];

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

            Close();

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public void Send(byte[] buf)

采用管道进行通讯的例子
采用管道进行通讯的例子

            if (m_Handle == NTKernel.INVAILD_HANDLE)

采用管道进行通讯的例子
采用管道进行通讯的例子

                Connect();

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

            //Build Message Head

采用管道进行通讯的例子

            byte[] syncHead = BitConverter.GetBytes(SYNC_HEAD);

采用管道进行通讯的例子

            byte[] length = BitConverter.GetBytes(buf.Length);

采用管道进行通讯的例子

            byte[] lengthBuf = new byte[syncHead.Length + length.Length];

采用管道进行通讯的例子
采用管道进行通讯的例子

            syncHead.CopyTo(lengthBuf, 0);

采用管道进行通讯的例子
采用管道进行通讯的例子

            for (int i = syncHead.Length; i < lengthBuf.Length; i++)

采用管道进行通讯的例子
采用管道进行通讯的例子

                lengthBuf[i] = length[i - syncHead.Length];

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

            WriteBuf(lengthBuf);

采用管道进行通讯的例子
采用管道进行通讯的例子

            //write content

采用管道进行通讯的例子

            if (buf.Length < m_BufferSize)

采用管道进行通讯的例子
采用管道进行通讯的例子

                WriteBuf(buf);

采用管道进行通讯的例子
采用管道进行通讯的例子

            else

采用管道进行通讯的例子
采用管道进行通讯的例子

                //the length of buf lardge than m_BufferSize

采用管道进行通讯的例子
采用管道进行通讯的例子

                int offset = 0;

采用管道进行通讯的例子
采用管道进行通讯的例子

                int len = Math.Min((int)m_BufferSize, buf.Length - offset);

采用管道进行通讯的例子
采用管道进行通讯的例子

                byte[] sendbuf;

采用管道进行通讯的例子
采用管道进行通讯的例子

                while (len > 0)

采用管道进行通讯的例子
采用管道进行通讯的例子

                    if (len == m_BufferSize)

采用管道进行通讯的例子
采用管道进行通讯的例子

                        sendbuf = m_SendBuf;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                        sendbuf = new byte[len];

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                    System.IO.MemoryStream m = new System.IO.MemoryStream(sendbuf);

采用管道进行通讯的例子

                    m.Write(buf, offset, len);

采用管道进行通讯的例子

                    m.Close();

采用管道进行通讯的例子

                    offset += len;

采用管道进行通讯的例子

                    len = Math.Min((int)m_BufferSize, buf.Length - offset);

采用管道进行通讯的例子

                    WriteBuf(sendbuf);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        ~PipeClient()

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

NTKernel.cs 

这个程序文件Client 和 Server 都要,封装了相应的API函数

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

using System.Runtime.InteropServices;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

namespace Pipe.Win32

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

    Data Structures

采用管道进行通讯的例子
采用管道进行通讯的例子

    public class NTKernel

采用管道进行通讯的例子
采用管道进行通讯的例子

        public const uint PIPE_UNLIMITED_INSTANCES = 255;

采用管道进行通讯的例子

        public const uint INVAILD_HANDLE = 0xFFFFFFFF;

采用管道进行通讯的例子

        public const uint ERROR_FILE_NOT_FOUND = 2;

采用管道进行通讯的例子

        public const uint ERROR_PIPE_BUSY = 231;

采用管道进行通讯的例子
采用管道进行通讯的例子

        internal const uint INFINITE = 0xFFFFFFFF;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        [DllImport("kernel32", EntryPoint = "GetLastError", SetLastError = true, CharSet = CharSet.Unicode)]

采用管道进行通讯的例子

        public static extern uint GetLastError();

采用管道进行通讯的例子
采用管道进行通讯的例子

        [DllImport("kernel32.dll", SetLastError = true)]

采用管道进行通讯的例子

        public static extern uint CreateNamedPipe(string lpName, uint dwOpenMode,

采用管道进行通讯的例子

           uint dwPipeMode, uint nMaxInstances, uint nOutBufferSize, uint nInBufferSize,

采用管道进行通讯的例子

           uint nDefaultTimeOut, SecurityAttributes lpSecurityAttributes);

采用管道进行通讯的例子
采用管道进行通讯的例子

        [DllImport("kernel32.dll")]

采用管道进行通讯的例子

        public static extern bool ConnectNamedPipe(uint hNamedPipe,

采用管道进行通讯的例子

           IntPtr lpOverlapped);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public static extern bool DisconnectNamedPipe(uint hNamedPipe);

采用管道进行通讯的例子
采用管道进行通讯的例子

        [DllImport("kernel32.dll", SetLastError=true)] 

采用管道进行通讯的例子

        public static extern int WaitNamedPipeA (string lpNamedPipeName, int nTimeOut);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public static extern bool ReadFile(uint hFile, byte[] lpBuffer,

采用管道进行通讯的例子

           uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, IntPtr lpOverlapped);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public static extern bool WriteFile(uint hFile, byte[] lpBuffer,

采用管道进行通讯的例子

           uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten,

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public static extern bool CloseHandle(uint hHandle);

采用管道进行通讯的例子
采用管道进行通讯的例子

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]

采用管道进行通讯的例子

        public static extern uint CreateFile(

采用管道进行通讯的例子

              string lpFileName,

采用管道进行通讯的例子

              uint dwDesiredAccess,

采用管道进行通讯的例子

              uint dwShareMode,

采用管道进行通讯的例子

              SecurityAttributes lpSecurityAttributes,

采用管道进行通讯的例子

              uint dwCreationDisposition,

采用管道进行通讯的例子

              uint dwFlagsAndAttributes,

采用管道进行通讯的例子

              int hTemplateFile

采用管道进行通讯的例子

              );

采用管道进行通讯的例子
采用管道进行通讯的例子

        Mutex

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        Semaphore

采用管道进行通讯的例子
采用管道进行通讯的例子

        Event

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

    class Mutex : IDisposable

采用管道进行通讯的例子
采用管道进行通讯的例子

        IntPtr m_Handle;

采用管道进行通讯的例子
采用管道进行通讯的例子

        public Mutex(SecurityAttributes lpEventAttributes, bool bInitialOwner, string lpName)

采用管道进行通讯的例子
采用管道进行通讯的例子

            m_Handle = NTKernel.CreateMutex(lpEventAttributes, bInitialOwner, lpName);

采用管道进行通讯的例子
采用管道进行通讯的例子

            if (m_Handle == IntPtr.Zero)

采用管道进行通讯的例子
采用管道进行通讯的例子

                uint err = NTKernel.GetLastError();

采用管道进行通讯的例子

                throw new Exception(String.Format("Create Event fail, error={0}",

采用管道进行通讯的例子

                    err));

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public Mutex(bool bInitialOwner, string lpName)

采用管道进行通讯的例子
采用管道进行通讯的例子

            m_Handle = NTKernel.CreateMutex(null, bInitialOwner, lpName);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public bool WaitOne(uint dwMilliseconds)

采用管道进行通讯的例子
采用管道进行通讯的例子

            WaitForState waitForState = (WaitForState)NTKernel.WaitForSingleObject((uint)m_Handle, dwMilliseconds);

采用管道进行通讯的例子
采用管道进行通讯的例子

            if (waitForState == WaitForState.WAIT_OBJECT_0)

采用管道进行通讯的例子
采用管道进行通讯的例子

                return true;

采用管道进行通讯的例子
采用管道进行通讯的例子

            else if (waitForState == WaitForState.WAIT_TIMEOUT)

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                throw new System.Threading.AbandonedMutexException();

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public bool WaitOne()

采用管道进行通讯的例子
采用管道进行通讯的例子

            return WaitOne(NTKernel.INFINITE);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public void ReleaseMutex()

采用管道进行通讯的例子
采用管道进行通讯的例子

            NTKernel.ReleaseMutex(m_Handle);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                if (m_Handle != IntPtr.Zero)

采用管道进行通讯的例子
采用管道进行通讯的例子

                    if (NTKernel.CloseHandle((uint)m_Handle))

采用管道进行通讯的例子
采用管道进行通讯的例子

                        m_Handle = IntPtr.Zero;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        ~Mutex()

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        IDisposable Members

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

    public class Event : IDisposable

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public Event()

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public Event(SecurityAttributes lpEventAttributes, bool bManualReset, bool bInitialState, string lpName)

采用管道进行通讯的例子
采用管道进行通讯的例子

            m_Handle = NTKernel.CreateEvent(lpEventAttributes, bManualReset, bInitialState, lpName);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public bool Open(EventAccess dwDesiredAccess, bool bInheritHandle, string lpName)

采用管道进行通讯的例子
采用管道进行通讯的例子

            m_Handle = NTKernel.OpenEvent((uint)dwDesiredAccess, bInheritHandle, lpName);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public WaitForState WaitFor(uint dwMilliseconds)

采用管道进行通讯的例子
采用管道进行通讯的例子

            return (WaitForState)NTKernel.WaitForSingleObject((uint)m_Handle, dwMilliseconds);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public WaitForState WaitFor()

采用管道进行通讯的例子
采用管道进行通讯的例子

            return WaitFor(NTKernel.INFINITE);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public void SetEvent()

采用管道进行通讯的例子
采用管道进行通讯的例子

            NTKernel.SetEvent(m_Handle);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        public void Release()

采用管道进行通讯的例子
采用管道进行通讯的例子

            NTKernel.ResetEvent(m_Handle);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        ~Event()

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

客户端调用

采用管道进行通讯的例子

            byte[] buf = new byte[10240];

采用管道进行通讯的例子

            Pipe.Client.PipeClient client = new Pipe.Client.PipeClient("test", 102400);

采用管道进行通讯的例子
采用管道进行通讯的例子

            for (int i = 0; i < 10000; i++)

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                    client.Send(buf);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                    Console.WriteLine(e.Message);

采用管道进行通讯的例子
采用管道进行通讯的例子

                finally

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

服务器调用

采用管道进行通讯的例子

        static bool begin = true;

采用管道进行通讯的例子

        static System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();

采用管道进行通讯的例子

        static int count = 0;

采用管道进行通讯的例子

        static object lockObj = new object();

采用管道进行通讯的例子
采用管道进行通讯的例子

        static void ReceiveMessage(System.IO.MemoryStream m)

采用管道进行通讯的例子
采用管道进行通讯的例子

            //Console.WriteLine(msg.Event);

采用管道进行通讯的例子
采用管道进行通讯的例子

            lock (lockObj)

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                if (begin)

采用管道进行通讯的例子
采用管道进行通讯的例子

                    watch.Start();

采用管道进行通讯的例子

                    begin = false;

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

                count++;

采用管道进行通讯的例子
采用管道进行通讯的例子

                if (count == 10000)

采用管道进行通讯的例子
采用管道进行通讯的例子

                    watch.Stop();

采用管道进行通讯的例子

                    float len = m.Length;

采用管道进行通讯的例子
采用管道进行通讯的例子

                    Console.WriteLine(String.Format("{0} MB", (len * 10000 * 1000 / watch.ElapsedMilliseconds) / (1024 * 1024)));

采用管道进行通讯的例子

                    Console.WriteLine(String.Format("{0} ms", watch.ElapsedMilliseconds));

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        static void ReceiveMessageError(Exception e)

采用管道进行通讯的例子
采用管道进行通讯的例子

            Console.WriteLine(e.Message);

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子

        static void Main(string[] args)

采用管道进行通讯的例子
采用管道进行通讯的例子

            Pipe.Server.PipeServer server = new Pipe.Server.PipeServer("Test", 102400);

采用管道进行通讯的例子

            server.OnReceiveMessage = ReceiveMessage;

采用管道进行通讯的例子

            server.OnReceiveMessageError = ReceiveMessageError;

采用管道进行通讯的例子

            server.Listen();

采用管道进行通讯的例子
采用管道进行通讯的例子
采用管道进行通讯的例子
源码下载位置

继续阅读