본문 바로가기

Windows/_System Programming

프로세스간 통신(IPC) - 메일 슬롯(MailSlot)

IPC (Inter-Process Communication) : 프로세스 사이의 통신


메일 슬롯(Mail Slot)의 원리 :

프로세스는 자신에게 할당된 메모리 공간 이외에는 접근할 수가 없다.

따라서 Mail Slot (우체통)을 이용하여 데이터를 송·수신한다.

데이터를 수신하고자 하는 프로세스 A(Receiver)가 Mail Slot 을 생성한다.

데이터를 송신하고자 하는 프로세스 B(Sender)가 프로세스 A의 Mail Slot 의 주소로 데이터를 송신한다.

프로세스 A가 자신의 Mail Slot 을 통해 데이터를 얻게 된다.



메일 슬롯(Mail Slot) 구성 :

Recevier :

Mail Slot 를 생성한다.

HANDLE CreateMailslot(
      LPCTSTR lpName,                 // 메일슬롯 주소
      DWORD nMaxMessageSize,    // 메일슬롯의 버퍼 크기
      DWORD lReadTimeout,            // 최대 블로킹 시간(밀리세컨드 : ms) 
      LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 핸들 상속 여부
};

Mail Slot 에 들어있는 데이터를 읽어온다.

BOOL ReadFile(
      HANDLE hFile,                                  // 해당 파일(Mail Slot)에 존재하는 데이터를 읽어들인다
      LPCVOID lpBuffer,                             // 읽어 들인 데이터를 저장할 버퍼 지정
      DWORD nNumberOfBytesToWrite,       // 읽어 들일 데이터의 최대 크기 지정  
      LPDWORD lpNumberOfBytesWritten,    // 함수 호출 완료 후 읽어 들인 실제 데이터의 크기를 바이트 단위로
                                                                얻기 위한 변수의 주소 지정
      LPOVERLAPPED lpOverlapped           //
);


Sender :

Mail Slot 의 주소를 얻는다.
(예: "\\\\컴퓨터이름\\mailslot\\[path]name", (아스키코드 기반), 로컬컴퓨터 : . (컴퓨터이름))

해당 Mail Slot 과 연결한다.

HANDLE CreateFile(
      LPCTSTR lpFileName,                // 개방(open)할 파일 이름
      DWORD dwDesiredAccess,          // 읽기/쓰기 모드를 지정한다.(or (l) 연산으로 결합)
                                                          GENERIC_READ : 읽기 모드
                                                          GENERIC_WRITE : 쓰기 모드
      DWORD dwShareMode,               // 파일 공유방식 
                                                          0 : 다른 프로세스에 절대 공유 불가. 중복 개방 불가
                                                          FILE_SHARE_READ : 다른 프로세스에서 동시 읽기 접근 가능
                                                          FILE_SHARE_WRITE : 다른 프로세스에서 동기 쓰기 접근 가능
      LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 보안 속성
      DWORD dwCreationDisposition,    // 파일의 생성되는 방법을 지정
                                                          CREATE_ALWAYS : 항상 새 파일을 생성
                                                          CREATE_NEW : 새 파일 생성, 같은 이름의 파일이 존재하면 생성 실패
                                                          OPEN_ALWAYS : 기존 파일 개방. 없으면 생성
                                                          OPEN_EXISTING : 기존 파일 개방, 존재하지 않으면 함수 호출 실패
                                                          TRUNCATE_EXISTING : 기존 파일의 내용 지우고 개방.
      DWORD dwFlagsAndAttributes,     // 파일의 특성 정보를 설정 (기본적 FILE_ATTRIBUTE_NORMAL 사용)
      HANDLE hTemplateFile               // 기존에 존재하는 파일과 동일한 특성을 가지는 새 파일을 만들때 사용
);

해당 Mail Slot 에 데이터를 전송한다.

BOOL WriteFile(
      HANDLE hFile,                                  // 데이터를 읽어 들일 파일을 지정(Mail Slot)
      LPCVOID lpBuffer,                             // 전송할 데이터가 저장되어 있는 버퍼 지정
      DWORD nNumberOfBytesToWrite,       // 전송할 데이터 크기를 지정한다  
      LPDWORD lpNumberOfBytesWritten,    // 함수 호출 완료 후 전송된 실제 데이터의 크기를 바이트 단위로
                                                                얻기 위한 변수의 주소 지정
      LPOVERLAPPED lpOverlapped           //
);



메일 슬롯의 특징 :

메일슬롯에 할당된 주소를 기반으로 통신하기 떄문에 관계없는 프로세스들 사이에서도 통신이 가능하다.

(네트워크 연결되어 통신하는 프로세스들이나 부모 자식간의 연관 관계가 없는 프로세스들)


한쪽 방향으로만 메시지를 전달할 수 있다.

(서로 데이터를 주고 받기 위해서는 각각 메일슬롯을 생성해야 한다)


브로드캐스팅(Broadcasting) 방식의 통신을 지원한다.

Sender 는 한번의 메시지 전송으로 여러 Receiver 에게 동일한 메시지를 동시에 전송하는 것이 가능하다.

(예 :

컴퓨터 이름이 와야 하는 부분에 '*' 을 사용하면 네트워크에 연결되어 있는 모든 컴퓨터를 지칭한다.

따라서 모든 컴퓨터에 해당 주소로 생성된 메일슬롯에 동일한 메시지가 전달된다)