본문 바로가기
Development/Visual C#

[C#] NamedPipe 사용 예제

by qWooWp 2021. 7. 9.
반응형

프로세스 간에 통신을 하기 위해서 PIPE 를 이용한 통신 예제를 작성해 보았다. 

예제는 단방향 이지만 조금만 응용하면 양방향으로도 사용이 가능하다. 

PIPE 는 Client 와 Server 클래스가 각각 존재 하며 이를 주의 해야 함. 

 

클라이언트 PIPE

        Thread m_pipe_thread;
        bool m_bTerminate = false;

        NamedPipeClientStream m_pipeClient;

        public FrmClientMain()
        {
            InitializeComponent();

            CheckVisionAppTimer.Enabled = false;
            //PIPE 식별 GUID {0B444AB3-70A6-4486-9020-D14A78FF4533}
            m_pipeClient = new NamedPipeClientStream(".", "0B444AB3-70A6-4486-9020-D14A78FF4533",
                       PipeDirection.InOut, PipeOptions.None,
                       TokenImpersonationLevel.Impersonation);
            m_pipe_thread = new Thread(cb_thread_pipeworker);
            m_pipe_thread.Start();
        }

     
        public void cb_thread_pipeworker()
        {
            while (!m_bTerminate)
            {      
                if (!m_pipeClient.IsConnected)
                {
                    try
                    {
                        m_pipeClient.Connect(1000); // TIMEOUT 1 sec
                        Console.WriteLine("PIPE SERVER CONNECTED...", true);
                    }catch(Exception ee)
                    {
                        Console.WriteLine(ee.Message);
                    }
                    Thread.Sleep(2000);                   
                    continue;
                }
                else
                {
                    if (CheckVisionAppTimer.Enabled == false)
                        CheckVisionAppTimer.Enabled = true;
                }

                try
                {
                    StreamWriter writer = new StreamWriter(m_pipeClient);
                    writer.WriteLine("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
                    writer.Flush();
                }catch(Exception ee)
                {
                    Console.WriteLine(ee.Message);
                }
                Thread.Sleep(2000);
            }
        }

 

PIPE 서버

 
        NamedPipeServerStream m_pipeServer;
        Thread m_pipe_client_thread;
        bool m_bTerminate = false;
        private void button1_Click(object sender, EventArgs e)
        {
            
            m_bTerminate = false;
            try
            {
                //PIPE 식별 GUID {0B444AB3-70A6-4486-9020-D14A78FF4533}
                m_pipeServer = new NamedPipeServerStream("0B444AB3-70A6-4486-9020-D14A78FF4533",
                           PipeDirection.InOut);

               
            }catch(Exception ee)
            {
                Console.WriteLine(ee.Message);
            }
            // 통합 제어 시스템 클라이언트와 통신하기 위한 스래드 생성
            m_pipe_client_thread = new Thread(cb_thread_PipeWorker);
            m_pipe_client_thread.Start();
        }

        public void cb_thread_PipeWorker()
        {
            while (!m_bTerminate)
            {
                m_pipeServer.WaitForConnection();

                Console.WriteLine("Connected.");
                while (m_pipeServer.IsConnected)
                {
                    var read = new byte[4096];
                    int iRet = m_pipeServer.Read(read, 0, read.Length);
                    if (iRet > 0)
                    {
                        var msg = Encoding.UTF8.GetString(read).TrimEnd('\0');
                        Console.WriteLine(msg);
                    }
                }                   

                Thread.Sleep(10);
            }
        }
반응형

댓글