본문 바로가기

High Level Technique/Window System

메일 슬롯 (Mail Slot)

메일 슬롯 (Mail Slot)



A 프로세스와 B 프로세스가 직접적으로 데이터를 주고 받지 못합니다.(안정성을 위해서. 애초에 메모리 상에 올라가는 주소 영역이 다름.) 이를 해결하기 위한 것이 Mail Slot인데 데이터를 전달하는 것을 Sender 데이터를 받는 것을 Receiver라고 할 때 Sender가 데이터를 보내 Receiver가 바로 받아 처리한다면 좋지만 각 영역에 접근을 할 수 없기 때문에 Sender는 Mail Slot에 데이터를 보내고 Receiver가 Mail Slot에 있는 데이터를 가져옵니다.


Sender와 Receiver를 작성할때 CreateFile, WriteFile를 사용하는데 이는 ANSI 표준이 아니고 Windows에서 제공하는 파일 관련 시스템 함수들입니다.

함수 이름을 보면 알 수 있듯 파일을 생성하고 읽는 역할을 합니다. 이 함수를 이용해서 Sender와 Receiver가 작동하게 되죠.



Sender의 코드를 살펴보도록 하겠습니다.


#include <stdio.h>

#include <tchar.h>

#include <Windows.h>


#define SLOT_NAME _T("\\\\.\\mailslot\\mailbox")


int main(void)

{

HANDLE hMailSlot;

TCHAR message[50];

DWORD bytesWritten;


hMailSlot = CreateFile(SLOT_NAME, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);


while (1)

{

printf("Sender cmd >> ");

_fgetts(message, sizeof(message) / sizeof(TCHAR), stdin);


if (!WriteFile(hMailSlot, message, _tcslen(message)*sizeof(TCHAR), &bytesWritten, NULL))

{

printf("Unable to write! \n");

CloseHandle(hMailSlot);

return 1;

}


if (!_tcscmp(message, _T("Exit")))

{

printf("Good Bye! \n");

break;

}

}


CloseHandle(hMailSlot);


return 0;

}



Sender.cpp를 보면 앞서 MailSlot를 만들어서 데이터를 받아야 한다고 했습니다. 그래서 define을 이용해서 SLOT_NAME을 지정해주고, CreateFile을 이용해서 파일을 생성하고 writeFile을 이용해서 입력한 것을 MailSlot에 넣어줍니다. 


Receiver의 코드를 살펴보도록 하겠습니다.


#include <stdio.h>

#include <tchar.h>

#include <Windows.h>


#define SLOT_NAME _T("\\\\.\\mailslot\\mailbox")


int main(void)

{

HANDLE hMailSlot;

TCHAR messageBox[50];

DWORD bytesRead;


hMailSlot = CreateMailslot(SLOT_NAME, 0, MAILSLOT_WAIT_FOREVER, NULL);


printf("Message\n");


while (1)

{

if (!ReadFile(hMailSlot, messageBox, sizeof(TCHAR) * 50, &bytesRead, NULL))

{

printf("Unable to read!\n");

CloseHandle(hMailSlot);

return 1;

}


if (!_tcsncmp(messageBox, _T("Exit"), 4))

{

printf("Good Bye!\n");

break;

}


messageBox[bytesRead / sizeof(TCHAR)] = 0;


_fputts(messageBox, stdout);

}


CloseHandle(hMailSlot);


return 0;

}


Receiver.cpp를 보면 CreateMailslot()을 이용해서 MailSlot를 생성합니다.

Sender에 의해서 전달된 내용을 Receiver의 messageBox에 저장하여 해당 내용을 출력해 줍니다.



출력 결과는 아래와 같습니다.