IPC-Mailslot 함수정리

kentaro81의 이미지

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로 한정이 되어있어서 아쉽다. 하지만 가장 간편하게 데이터를 보내고 받을 수 있는 장점이 있다.

File attachments: 
첨부파일 크기
Microsoft Office document icon MailSlot.doc42 KB
Forums: 
iadoy의 이미지

한 번에 메일슬롯에 기록할 수 있는 데이터 크기를 말하는 건가요?...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.