// ShareServer.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <assert.h>

typedef struct
{
 int a;
 float b;
 double c;
 char buffer[64];
} MYSTRUCT;

int _tmain(int argc, _TCHAR* argv[])
{
 HANDLE hMemoryMap = NULL;
 LPBYTE pMemoryMap = NULL;

 hMemoryMap = ::CreateFileMapping(
  (HANDLE)0xffffffff, // 파일 맵의 핸들, 초기에 0xffffffff를 설정한다.
  NULL,        // 보안 속성
  PAGE_READWRITE,    // 읽고/쓰기 속성
  0,        // 64비트 어드레스를 사용한다. 상위 32비트 - 메모리의 크기
  sizeof(MYSTRUCT),// 하위 32비트 - 여기선LPBYTE 타입.
  L"fork_server1");// 공유 파일맵의 이름 - Uique 해야한다.

 if(!hMemoryMap) {
  ::MessageBox(NULL, L"공유 메모리를 생성할 수 없습니다.", L"Error", MB_OK);
  return FALSE;
 }

 pMemoryMap = (BYTE*)::MapViewOfFile(
  hMemoryMap,    // 파일맵의 핸들
  FILE_MAP_ALL_ACCESS,    // 액세스 모드 - 현재는 쓰기
  0,        // 메모리 시작번지부터의 이격된 상위 32비트
  0,        // 메모리 시작번지부터의 이격된 하위 32비트
  0);        // 사용할 메모리 블록의 크기 - 0이면 설정한 전체 메모리

 if(!pMemoryMap)
 {
  CloseHandle(hMemoryMap);
  ::MessageBox(NULL, L"공유 메모리를 열수 없습니다.",  L"Error", MB_OK);
  return FALSE;
 }

 __int64 check = 0;
 MYSTRUCT* pStruct = (MYSTRUCT*)pMemoryMap;
 while(1)
 {
  pStruct->a = check;
  pStruct->b = 0.1f;
  pStruct->c = 0.0000001;
  strcpy(pStruct->buffer, "12345678901234567890\n");

  printf("%s", pStruct->buffer);

  if(check++%100000 == 0)
  {
   if(_kbhit() != 0)
    break;
  }
 }

 if(pMemoryMap)
  UnmapViewOfFile(pMemoryMap);

 if(hMemoryMap)
  CloseHandle(hMemoryMap);
 return 0;
}

공유 메모리를 이용한 서버 소스 이다. 가끔은 공유메모리를 사용할때가 있다.

+ Recent posts