본문 바로가기

Windows/_System Programming

프로세스간 통신(IPC) - 파이프(Pipe)

이름없는 파이프(Anonymous Pipe) :

단방향 통신방식이며, 파이프를 통해서 생성된 핸들을 기반으로 통신하기에 프로세스들 사이에 관계가 있어야 한다.

BOOL CreatePipe(
          PHANDLE hReadPipe,     // 데이터를 읽기 위한 파이프 끝 핸들
          PHANDLE hWritePipe,     // 데이터를 쓰기 위한 파이프 끝 핸들
          LPSECURITY_ATTRIBUTES lpPipeAttributtes, // 보안 정보
          DWORD nSize                // 파이프의 버퍼 사이즈
);

(참고 : 파이프는 두 개의 끝을 가지고 있다.
한쪽 끝에는 데이터가 들어가고 다른 한쪽에서는 들어간 데이터가 흘러 나온다)



이름있는 파이프(Named Pipe) :

주소 정보가 있어 관게없는 프로세스들 사이에서도 통신이 가능하며 양방향 통신을 지원한다.


서버 영역 :

CreateNamedPipe 함수를 통해 파이프를 생성한다.

HANDLE CreateNamedPipe(
          LPCTSTR lpName,             // 파이프 이름을 지정한다.
          DWORD dwOpenMode,       // 파이프 개방시 읽기/쓰기 모드를 지정한다.
                                                     PIPE_ACCESS_DUPLEX : 읽기, 쓰기가 모두 가능하도록 설정.
                                                     PIPE_ACCESS_INBOUND : 읽기만 가능
                                                     PIPE_ACCESS_OUTBOUND : 쓰기만 가능
          DWORD dwPipeMode,        // 데이터 송·수신 타입, 블로킹 모드. 총 3가지를 설정
          DWORD nMaxInstances,     // 생성할 수 있는 파이프의 최대 개수
          DWORD nOutBufferSize,      // 출력 버퍼 사이즈
          DWORD nInBufferSize,        // 입력 버퍼 사이즈
          DWORD nDefaultTimeOut,   // 연결을 기다리는 시간(밀리세컨드)
          LPSECURITY_ATTRIBUTES lpSecurityAttributes // 보안 속성
);  

DWORD dwPipeMode :

데이터 전송방식 : PIPE_TYPE_BYTE, PIPE_TYPE_MESSAGE
데이터 전송 시 바이너리 형태로 전송할 것인지, 텍스트 형태로 전송할 것인지 결정.

데이터 수신방식 : PIPE_READMODE_BYTE, PIPE_READMODE_MESSAGE
데이터 수신 시 바이너리 방식으로 읽을 것인지, 텍스트 방식으로 읽을 것인지 결정.

함수 리턴 방식 : PIPE_WAIT(블로킹), PIPE_NOWAIT(넌-블로킹)
무조건 PIPE_WAIT 가 전달된다.
(참고 : PIPE_NOWAIT 는 Microsoft LAN Manager version 2.0과 호환성을 위해 제공되는 파라미터이다)


ConnectNamedPipe 함수를 호출하여 연결 요청을 기다리는 파이프로 상태를 변경한다.

BOOL ConnectNamedPipe(
         HANDLE hNamedPipe,                    // CreateNamedPipe 함수 호출을 통해 생성한 파이프의 핸들을 전달
         LPOVERLAPPED lpOverlapped         // 중첩 I/O를 위하여 전달
);



클라이언트 영역 :

CreateFile 함수를 통해 파이프로 연결 요청을 한다.


WaitNamedPipe 함수를 통해 서버와의 파이프 연결을 기다린다.

BOOL WaitNamedPipe(
         LPCTSTR lpNamedPipeName,          // 상태 확인의 대상이 되는 파이프 이름
         DWORD nTimeOut                            // 타임-아웃 시간 설정
                                                                  이 시간이 지나서 함수를 빠져나올 경우 FALSE 리턴
                                                                  NMPWAIT_WAIT_FOREVER : 연결 가능한 상태가 될때까지 기다림
                                                                  NMPWAIT_USE_DEFAULT_WAIT : 디폴트 시간만큼 기다림
);



(추가 :

파이프의 속성을 변경시키는 함수 : SetNamedPipeHandleState

BOOL SetNamedPipeHandleState(
          HANDLE hNamedPipe,                      // 파이프와의 연결 속성을 변경시키기 위한 핸들
          LPDWORD lpMode,                           // 데이터 송·수신 모드와 함수의 리턴모드에 대한 값 전달
          LPDWORD lpMaxCollectionCount,       // 버퍼링할 수 있는 최대 바이트 크기
                                                                    클라이언트와 서버가 같은 PC 일 경우 NULL 을 전달
          LPDWORD lpCollectDataTimeOut        // 버퍼링을 허용하는 최대 시간(밀리세컨드)
                                                                    클라이언트와 서버가 같은 PC 일 경우 NULL 을 전달
);)