처음에 inlline 굳이 쓴건, 어차피 컴파일러가 자동으로 inline화를 판단하지만, inline키워드를 씀으로써 const키워드처럼 필요없지만 (물론 const는 항상 필요없는건 아니다) 명시적으로 넣어주는 습관을 가지려고 쓴건데... 이렇게 복잡한 키워드인지 몰랐다.
하...걍 inline써도 컴파일러가 inline화 무시할 때도 있고, inline안써도 컴파일러가 알아서 inline화 시킬 때도 있는데, 걍 쓰지 맙시다.....
#include <windows.h>
#include <iostream>
// 쓰는 프로세스
int main()
{
// 공유 메모리 생성
HANDLE hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // 물리적 파일이 아닌 메모리 사용
nullptr, // 기본 보안 속성
PAGE_READWRITE, // 읽기/쓰기 가능
0, // 고위 메모리 크기 (사용 안 함)
256, // 공유 메모리 크기 (256 바이트)
L"SharedMemoryExample"); // 공유 메모리 이름
// 공유 메모리 매핑
LPVOID pBuf = MapViewOfFile(
hMapFile, // 메모리 매핑 핸들
FILE_MAP_ALL_ACCESS, // 읽기/쓰기 액세스
0, 0, 0); // 전체 영역 매핑
// 데이터 쓰기
const char* message = "Hello!";
CopyMemory(pBuf, message, strlen(message) + 1);
Sleep(5000);
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return 0;
}
읽기
#include <windows.h>
#include <iostream>
// 읽는 프로세스
int main()
{
Sleep(1000);
// 공유 메모리 열기
HANDLE hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // 읽기/쓰기 액세스
FALSE, // 자식 프로세스 상속 여부 (아니오)
L"SharedMemoryExample"); // 공유 메모리 이름 (생성 시와 동일해야 함)
// 공유 메모리 매핑
LPVOID pBuf = MapViewOfFile(
hMapFile, // 메모리 매핑 핸들
FILE_MAP_ALL_ACCESS, // 읽기/쓰기 액세스
0, 0, 0);
// 데이터 읽기
std::cout << "공유 메모리에서 데이터를 읽었습니다: " << static_cast<char*>(pBuf) << std::endl;
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
}
소켓 (Socket)
특징
네트워크 인터페이스를 통해 두 프로세스가 데이터를 주고받는 방식입니다.
데이터를 양방향으로 주고받을 수 있습니다.
TCP(연결 지향)방식과 UDP(비연결 지향)방식이 있습니다.
장점
같은 시스템 내에서의 통신 뿐만이 아니라, 네트워크를 통한 다른 컴퓨터와의 통신이 가능합니다.
#include <iostream>
#include <windows.h>
#define FILE_PATH "example.txt"
#define BUFFER_SIZE 256
int main() {
// 파일 열기(없으면 생성)
HANDLE hFile = CreateFileA(
FILE_PATH, // 파일 경로
GENERIC_READ | GENERIC_WRITE, // 읽기/쓰기 권한
0, // 공유 모드 없음
NULL, // 보안 속성
OPEN_ALWAYS, // 파일이 없으면 생성
FILE_ATTRIBUTE_NORMAL, // 일반 파일 속성
NULL // 템플릿 파일 없음
);
if (hFile == INVALID_HANDLE_VALUE) {
std::cerr << "CreateFile failed: " << GetLastError() << std::endl;
return -1;
}
// 파일 매핑 생성
HANDLE hMapFile = CreateFileMappingA(
hFile, // 파일 핸들
NULL, // 보안 속성
PAGE_READWRITE, // 읽기/쓰기 권한
0, // 파일 크기 상위 32비트
BUFFER_SIZE, // 파일 크기 하위 32비트
NULL // 이름 없음
);
if (hMapFile == NULL) {
std::cerr << "CreateFileMapping failed: " << GetLastError() << std::endl;
CloseHandle(hFile);
return -1;
}
// 매핑된 메모리 접근
LPVOID pBuf = MapViewOfFile(
hMapFile, // 메모리 매핑 핸들
FILE_MAP_ALL_ACCESS, // 접근 권한
0, // 오프셋 상위 32비트
0, // 오프셋 하위 32비트
BUFFER_SIZE // 매핑 크기
);
if (pBuf == NULL) {
std::cerr << "MapViewOfFile failed: " << GetLastError() << std::endl;
CloseHandle(hMapFile);
CloseHandle(hFile);
return -1;
}
// 데이터 쓰기
strcpy_s((char*)pBuf, BUFFER_SIZE, "Hello, File Mapping!");
std::cout << "Data written to file via mapping: " << (char*)pBuf << std::endl;
// 메모리 해제
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
CloseHandle(hFile);
return 0;
}