服务器与客户端通过共享内存进行通信
1.common.h
#ifndef __COMMON_H
#define __COMMON_H
#define TEXT_LEN 2048
// 共享内存的数据结构
struct SharedMemEntry
{
bool can_read; // 是否可以读取共享内存,用于进程同步
char message[TEXT_LEN];
};
#endif // __COMMON_H
2.server.cpp
#include "common.h"
#include <iostream>
#include <chrono>
#include <sys/shm.h>
#include <unistd.h>
int main()
{
SharedMemEntry *entry;
//1、申请共享内存
int shared_mem_id = shmget(1, sizeof(SharedMemEntry), 0600 | IPC_CREAT);
if (shared_mem_id == -1)
{
std::cout << "Create shared memory error" << std::endl;
return -1;
}
// 2、连接到当前进程空间/使用共享内存
entry = (SharedMemEntry *)shmat(shared_mem_id, 0, 0);
entry->can_read = false;
while (true)
{
if (entry->can_read)
{
std::cout << "Received message:" << entry->message << std::endl;
entry->can_read = false;
}
else
{
std::cout << "Entry can not be read. Sleep 1s." << std::endl;
sleep(1);
}
}
// 3、脱离进程空间
shmdt(entry);
// 4、删除共享内存
shmctl(shared_mem_id, IPC_RMID, 0);
return 0;
}
- client.cpp
#include "common.h"
#include <sys/shm.h>
#include <iostream>
#include <cstring>
int main()
{
SharedMemEntry *entry;
// 1、申请共享内存
int shmid = shmget(1, sizeof(SharedMemEntry), 0600 | IPC_CREAT);
if (shmid == -1)
{
std::cout << "Create shared memory failer" << std::endl;
return -1;
}
// 连接到当前进程空间
entry = (SharedMemEntry *)shmat(shmid, 0, 0);
entry->can_read = false;
char buffer[TEXT_LEN];
while (true)
{
if (!entry->can_read)
{
std::cout << "input message >>>";
fgets(buffer, TEXT_LEN, stdin);
strncpy(entry->message, buffer, TEXT_LEN);
std::cout << "send message: " << entry->message << std::endl;
entry->can_read = true;
}
}
shmdt(entry);
shmctl(shmid, IPC_RMID, 0);
}```