using System; using System.Text; using System.Threading; using Cosmos.UserFrame; using System.IO.Pipes; //using Microsoft.Win32.SafeHandles; //using System; //using System.Diagnostics; //using System.IO; //using System.Runtime.InteropServices; //using System.Security.AccessControl; //using System.Security.Principal; //using System.Text; //using System.Threading; //using Cosmos.BaseFrame; //using Cosmos.UserFrame; //using Cosmos.ServiceProvider; //using Cosmos.Common; //using Cosmos.CommonManager; //using Cosmos.UI; namespace Cosmos.Service { // Delegate for passing received message back to caller public delegate void DelegateMessage(string Reply); class PipeServer { public event DelegateMessage PipeMessage; string _pipeName; private readonly int RECV_BUFFER_SIZE = 1024; private bool m_bConnected; public bool PipeConnected { get { return this.m_bConnected; } set { this.m_bConnected = value; } } // POS 기능키 /// /// 서버 대기 /// /// public void Listen(string PipeName) { try { m_bConnected = false; // Set to class level var so we can re-use in the async callback method _pipeName = PipeName; // Create the new async pipe NamedPipeServerStream pipeServer = new NamedPipeServerStream(PipeName, System.IO.Pipes.PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous); // Wait for a connection pipeServer.BeginWaitForConnection(new AsyncCallback(WaitForConnectionCallBack), pipeServer); m_bConnected = true; } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()" , ex.Message); } } /// /// 메세지 콜백 /// /// private void WaitForConnectionCallBack(IAsyncResult iar) { try { // Get the pipe NamedPipeServerStream pipeServer = (NamedPipeServerStream)iar.AsyncState; // End waiting for the connection pipeServer.EndWaitForConnection(iar); byte[] buffer = new byte[RECV_BUFFER_SIZE]; // Read the incoming message int rByteSize = pipeServer.Read(buffer, 0, RECV_BUFFER_SIZE); // Convert byte buffer to string UnicodeEncoding encoder = new UnicodeEncoding(); string stringData = encoder.GetString(buffer, 0, rByteSize); //encoder.GetString(buffer, 0, buffer.Length); //Debug.WriteLine(stringData + Environment.NewLine); //UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()" // , stringData); // Pass message back to calling form PipeMessage.Invoke(stringData); // Kill original sever and create new wait server pipeServer.Close(); pipeServer.Dispose(); pipeServer = null; Thread.Sleep(100); pipeServer = new NamedPipeServerStream(_pipeName, System.IO.Pipes.PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous); // Recursively wait for the connection again and again.... pipeServer.BeginWaitForConnection(new AsyncCallback(WaitForConnectionCallBack), pipeServer); m_bConnected = true; } catch (Exception ex) { m_bConnected = false; UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()" , ex.Message); return; } } } class PipeClient { /// /// 파이프 전송 /// /// /// /// public bool Send(string SendStr, string PipeName, int TimeOut = 1000) { try { NamedPipeClientStream pipeStream = new NamedPipeClientStream(".", PipeName, System.IO.Pipes.PipeDirection.InOut, PipeOptions.Asynchronous); // The connect function will indefinitely wait for the pipe to become available // If that is not acceptable specify a maximum waiting time (in ms) pipeStream.Connect(TimeOut); //Debug.WriteLine("[Client] Pipe connection established"); UnicodeEncoding encoder = new UnicodeEncoding(); byte[] _buffer = encoder.GetBytes(SendStr); //byte[] _buffer = Encoding.UTF8.GetBytes(SendStr); pipeStream.BeginWrite(_buffer, 0, _buffer.Length, AsyncSend, pipeStream); return true; } catch (TimeoutException ex) { UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()" , ex.Message); } return false; } /// /// Async전송 /// /// private void AsyncSend(IAsyncResult iar) { try { // Get the pipe NamedPipeClientStream pipeStream = (NamedPipeClientStream)iar.AsyncState; // End the write pipeStream.EndWrite(iar); pipeStream.Flush(); Thread.Sleep(100); pipeStream.Close(); pipeStream.Dispose(); } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()" , ex.Message); } } } }