이름없는 파이프(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 을 전달
);)
'Windows > _System Programming' 카테고리의 다른 글
메일슬롯(MailSlot) IPC 통신 소스 (0) | 2010.02.24 |
---|---|
커널 오브젝트(Kernel Object) - 2 (0) | 2010.02.23 |
프로세스간 통신(IPC) - 메일 슬롯(MailSlot) (0) | 2010.02.11 |
커널 오브젝트(Kernel Object) (2) | 2010.02.11 |
CreateProcess 함수 (0) | 2010.02.10 |