/// <summary> /// 클라이언트 생성하기 /// </summary> /// <param name="pipeName">파이프명</param> /// <param name="pipeDirection">파이프 방향</param> /// <returns>명명 파이프</returns> public static NamedPipe CreateClient(string pipeName, PipeDirection pipeDirection) { NamedPipe pipe = new NamedPipe(pipeName, pipeDirection); FileAccess fileAccess = GetFileAccess(pipeDirection); pipe.pipeHandle = CreateFile ( pipe.pipeName, (uint)fileAccess, 0, IntPtr.Zero, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, IntPtr.Zero ); if (pipe.pipeHandle.IsInvalid == true) { Console.WriteLine($"fail to connect for {GetLastError()}"); pipe.Dispose(); return(null); } pipe.pipeStream = new FileStream(pipe.pipeHandle, FileAccess.ReadWrite, (int)BUFFER_SIZE, true); return(pipe); }
////////////////////////////////////////////////////////////////////////////////////////// Instance //////////////////////////////////////////////////////////////////////////////// Public #region 연결 대기하기 - WaitForConnection() /// <summary> /// 연결 대기하기 /// </summary> /// <returns>자식 파이프</returns> public NamedPipe WaitForConnection() { if (string.IsNullOrEmpty(this.pipeName) == true || this.exitEventHandle == null) { Trace.WriteLine("파이프 서비스 종료"); return(null); } NamedPipe clientPipe = new NamedPipe(); clientPipe.pipeName = this.pipeName; clientPipe.pipeDirection = this.pipeDirection; SECURITY_ATTRIBUTE securityAttribute = GetSecurityAttribute(); clientPipe.pipeHandle = CreateNamedPipe ( clientPipe.pipeName, (uint)(this.pipeDirection | PipeDirection.FILE_FLAG_OVERLAPPED), PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, 255, BUFFER_SIZE, BUFFER_SIZE, 0, ref securityAttribute ); Marshal.FreeHGlobal(securityAttribute.SecurityDescriptor); if (clientPipe.pipeHandle.IsInvalid) { Trace.WriteLine("무효한 파이프 연결"); clientPipe.Dispose(); return(null); } NativeOverlapped nativeOverlapped = new NativeOverlapped(); SecurityIdentifier securityIdentifier = new SecurityIdentifier(WellKnownSidType.WorldSid, null); EventWaitHandleSecurity eventHandleSecurity = new EventWaitHandleSecurity(); bool created; eventHandleSecurity.AddAccessRule(new EventWaitHandleAccessRule(securityIdentifier, EventWaitHandleRights.FullControl, AccessControlType.Allow)); eventHandleSecurity.AddAccessRule(new EventWaitHandleAccessRule(securityIdentifier, EventWaitHandleRights.ChangePermissions, AccessControlType.Deny)); using (EventWaitHandle eventHandle = new EventWaitHandle(false, EventResetMode.ManualReset, null, out created, eventHandleSecurity)) { nativeOverlapped.EventHandle = eventHandle.SafeWaitHandle.DangerousGetHandle(); ConnectNamedPipe(clientPipe.pipeHandle, ref nativeOverlapped); int lastError = Marshal.GetLastWin32Error(); if (lastError == 997) { int completeCode = 0; IntPtr[] waitHandleArray = new IntPtr[] { eventHandle.SafeWaitHandle.DangerousGetHandle(), this.exitEventHandle.SafeWaitHandle.DangerousGetHandle() }; completeCode = WaitForMultipleObjects(waitHandleArray.Length, waitHandleArray, false, -1); if (completeCode == 0) { } else if (completeCode == 1) { Trace.WriteLine("파이프 서비스 종료 (리소스 해제)"); clientPipe.Dispose(); return(null); } } else if (lastError != 535) { Trace.WriteLine("파이프 연결 에러 : " + lastError); clientPipe.Dispose(); return(null); } else { Debug.WriteLine("연결되었습니다."); } } clientPipe.needToDisconnect = true; FileAccess fileAccess = GetFileAccess(clientPipe.pipeDirection); clientPipe.pipeStream = new FileStream(clientPipe.pipeHandle, fileAccess, (int)BUFFER_SIZE, true); if (clientPipe.pipeStream == null) { Trace.WriteLine("파이프 파일 스트림이 null 입니다."); clientPipe.Dispose(); return(null); } return(clientPipe); }
//////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 서버 생성하기 - CreateServer(pipeName, pipeDirection) /// <summary> /// 서버 생성하기 /// </summary> /// <param name="pipeName">파이프명</param> /// <param name="pipeDirection">파이프 방향</param> /// <returns>명명 파이프</returns> public static NamedPipe CreateServer(string pipeName, PipeDirection pipeDirection) { NamedPipe pipe = new NamedPipe(pipeName, pipeDirection); return(pipe); }