IPC-Mailslot 함수정리
MailSlot
Init Day 4 May 2009
Write by 최소영
1. 구현방식
메모리상에 접근권한을 가진 프로세스가 접근하여 데이터를 올려두고, 메일슬롯을 생성한 프로세스만이 데이터를 확인하는 방식 이다. 이때 한번에 올릴 수 있는 최대크기는 64Kb 이다.
2. 사용API
windows.h
3. 사용함수
HANDLE CreateMailslot(
__in LPCTSTR lpName,
__in DWORD nMaxMessageSize,
__in DWORD lReadTimeout,
__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes );
첫번째 인자 : 만들고자 하는 메일슬롯 이름(\\.\mailslot\[Path]Name)
두번째 인자 : 메시지의 데이터크기(0 은 길이제한을 두지 않는다.)
세번째 인자 : 메시지대기 시간(1/1000 초 단위, MAILSLOT_WAIT_FOREVER 일 경우 메시지가 올 때 까지 무한정 기다린다.)
네번째 인자 : 보안속성(NULL일 경우 디폴트 보안속성을 사용한다.)
사용 : 메일슬롯 생성(우체통 개설)
BOOL SetMailslotInfo(
__in HANDLE hMailslot,
__in DWORD lReadTimeout );
첫번째 인자 : 메일슬롯 핸들
두번째 인자 : 새로 지정할 대기시간(1/1000)값
사용 : 메일슬롯의 대기시간 수정
BOOL GetMailslotInfo(
__in HANDLE hMailslot,
__out_opt LPDWORD lpMaxMessageSize,
__out_opt LPDWORD lpNextSize,
__out_opt LPDWORD lpMessageCount,
__out_opt LPDWORD lpReadTimeout );
첫번째 인자 : 메일슬롯 핸들
두번째 인자 : 메시지의 최대 길이
세번째 인자 : 실제 읽은 메시지의 크기
네번째 인자 : 대기중인 메시지의 수
다섯번째 인자 : 타임아웃 값
사용 : 메일슬롯의 정보를 읽기(단순히 읽기만… 데이터는 안가져옴)
HANDLE CreateFile(
__in LPCTSTR lpFileName,
__in DWORD dwDesiredAccess,
__in DWORD dwShareMode,
__in LPSECURITY_ATTRIBUTES lpSecurityAttributes,
__in DWORD dwCreationDisposition,
__in DWORD dwFlagsAndAttributes,
__in HANDLE hTemplateFile );
첫번째 인자 : 파일 / 경로 이름
두번째 인자 : 엑세스 타입(GENERIC_READ / GENERIC_WRITE)
세번째 인자 : 열려진 파일의 공유모드( 0 / FILE_SHARE_READ / FILE_SHARE_WRITE)
네번째 인자 : 상속지정 포인터(NULL / SECURITY_ATTRIBUTES)
다섯번째 인자 : 생성/open 에러 처리(CREATE_NEW – 기존파일이 있으면 생성X
CREATE_ALWAYS – 기존파일 삭제 후 생성
OPEN_EXISTING – 파일이 없으면 에러코드 리턴
OPEN_ALWAYS – 파일이 없으면 새로 생성
TRUNCATE_EXISTING – 초기화 된 파일열기 )
여섯번째 인자 : 파일의 속성 설정(FILE_ATTRIBUTE_ARCHIVE – 아카이브 속성
FILE_ATTRIBUTE_HIDDEN – 숨은파일
FILE_ATTRIBUTE_NORMAL – 무속성 일반파일
FILE_ATTRIBUTE_OFFLINE – 연결되지 않은 파일
FILE_ATTRIBUTE_READONLY – 읽기전용
FILE_ATTRIBUTE_SYSTEM - 운영체제 파일
FILE_ATTRIBUTE_TEMPORARY – 임시 저장되는 파일)
일곱번째 인자 : 새로 만드는 파일의 추가속성 (NULL)
사용 : 메일슬롯에 파일을 기록할 공간을 확보한다.
BOOL ReadFile(
__in HANDLE hFile,
__out LPVOID lpBuffer,
__in DWORD nNumberOfBytesToRead,
__out LPDWORD lpNumberOfBytesRead,
__in LPOVERLAPPED lpOverlapped );
첫번째 인자 : 파일 핸들 / 메일슬롯 핸들
두번째 인자 : 파일의 내용을 담을 버퍼
세번째 인자 : 읽어올 버퍼의 크기
네번째 인자 : 실제 읽혀진 크기
다섯번째 인자 : 비동기 입출력(아닐 경우 NULL)
사용 : 메일슬롯의 데이터를 가져온다.
BOOL WriteFile(
__in HANDLE hFile,
__in LPCVOID lpBuffer,
__in DWORD nNumberOfBytesToWrite,
__out LPDWORD lpNumberOfBytesWritten,
__in LPOVERLAPPED lpOverlapped);
첫번째 인자 : 파일 핸들 / 메일슬롯 핸들
두번째 인자 : 전달할 버퍼
세번째 인자 : 기록할 버퍼의 크기
네번째 인자 : 실제 기록된 크기
다섯번째 인자 : 비동기 입출력(아닐 경우 NULL)
사용 : 메일슬롯에 데이터를 기록한다.
Epilogue
우편함을 생각해서 만든듯한 IPC기법이다. 메일슬롯은 단방향 통신이다. 보내는 쪽과 받는 쪽이 따로 구분이 되어있다. 응용한다면 받는 쪽도 메일슬롯을 만들고, 보내는 쪽도 메일슬롯을 만든다면 쌍방향처럼 보이겠지만…….또한 한번에 보낼 수 있는 크기가 64Kb로 한정이 되어있어서 아쉽다. 하지만 가장 간편하게 데이터를 보내고 받을 수 있는 장점이 있다.
첨부 | 파일 크기 |
---|---|
MailSlot.doc | 42 KB |
최대크기 64KB라면..
한 번에 메일슬롯에 기록할 수 있는 데이터 크기를 말하는 건가요?...
댓글 달기