共享内存业务类代码编写

SecKeyShm.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#pragma once
#include "ShareMemory.h"

class NodeSHMInfo
{
public:
int status;
int seckeyID;
char clientID[12];
char serverID[12];
char seckey[128];
};

class SecKeyShm : public ShareMemory
{
public:
SecKeyShm(int key);
SecKeyShm(int key, int maxNode);
SecKeyShm(const char* pathName);
SecKeyShm(const char* pathName, int maxNode);
~SecKeyShm();

int shmWrite(NodeSHMInfo* pNodeInfo);
int shmRead(const char* clientID, const char* serverID, NodeSHMInfo* pNodeInfo);

//for test
void printShm();
private:
int m_maxNode;
};

SecKeyShm.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include "SecKeyShm.h"
using namespace std;

SecKeyShm::SecKeyShm(int key):ShareMemory(key)
{

}

SecKeyShm::SecKeyShm(int key, int maxNode):
ShareMemory(key, sizeof(int) + maxNode*sizeof(NodeSHMInfo)), m_maxNode(maxNode)
{
//连接共享内存
void *p = mapShm();

//初始化共享内存
memset(p, 0x00, sizeof(int) + maxNode*sizeof(NodeSHMInfo));

//将maxNode写入共享内存的头4个字节
memcpy(p, &m_maxNode, sizeof(int));

//断开与共享内存的连接
unmapShm();
}

SecKeyShm::SecKeyShm(const char* pathName): ShareMemory(pathName)
{

}

SecKeyShm::SecKeyShm(const char* pathName, int maxNode):
ShareMemory(pathName, sizeof(int) + maxNode*sizeof(NodeSHMInfo)), m_maxNode(maxNode)
{
//连接共享内存
void *p = mapShm();

//初始化共享内存
memset(p, 0x00, sizeof(int) + maxNode*sizeof(NodeSHMInfo));

//将maxNode写入共享内存的头4个字节
memcpy(p, &m_maxNode, sizeof(int));

//断开与共享内存的连接
unmapShm();
}

SecKeyShm::~SecKeyShm()
{

}

int SecKeyShm::shmWrite(NodeSHMInfo* pNodeInfo)
{
//连接共享内存
void *p = mapShm();

//从头4个字节获取maxNode
memcpy(&m_maxNode, p, sizeof(int));
cout << "maxNode:" << m_maxNode << endl;

NodeSHMInfo *pNode = (NodeSHMInfo *)((char *)p+sizeof(int));

//先查找原有的
int i = 0;
for(i=0; i<m_maxNode; i++)
{
if(strcmp(pNodeInfo->clientID, pNode[i].clientID)==0 &&
strcmp(pNodeInfo->serverID, pNode[i].serverID)==0)
{
memcpy(&pNode[i], pNodeInfo, sizeof(NodeSHMInfo));
break;
}
}

//没找到原有的, 找一个空闲可用的
NodeSHMInfo tmp;
memset(&tmp, 0x00, sizeof(NodeSHMInfo));
if(i==m_maxNode)
{
for(i=0; i<m_maxNode; i++)
if(memcmp(&pNode[i], &tmp, sizeof(NodeSHMInfo))==0)
{
memcpy(&pNode[i], pNodeInfo, sizeof(NodeSHMInfo));
break;
}
}

//断开与共享内存的关联
unmapShm();

//没有空闲位置可用
if(i==m_maxNode)
{
cout << "no space to use" << endl;
return -1;
}

return 0;
}

int SecKeyShm::shmRead(const char* clientID, const char* serverID, NodeSHMInfo* pNodeInfo)
{
//连接共享内存
void *p = mapShm();

//从头4个字节获取maxNode
memcpy(&m_maxNode, p, sizeof(int));
cout << "maxNode:" << m_maxNode << endl;

NodeSHMInfo *pNode = (NodeSHMInfo *)((char *)p+sizeof(int));

int i = 0;
for(i=0; i<m_maxNode; i++)
{
if(strcmp(clientID, pNode[i].clientID)==0 &&
strcmp(serverID, pNode[i].serverID)==0)
{
memcpy(pNodeInfo, &pNode[i], sizeof(NodeSHMInfo));
break;
}
}

//断开与共享内存的关联
unmapShm();

//没有找到节点
if(i==m_maxNode)
{
cout << "not found" << endl;
return -1;
}

return 0;
}

void SecKeyShm::printShm()
{
//连接共享内存
void *p = mapShm();

//从头4个字节获取maxNode
memcpy(&m_maxNode, p, sizeof(int));
cout << "maxNode:" << m_maxNode << endl;

NodeSHMInfo *pNode = (NodeSHMInfo *)((char *)p+sizeof(int));

int i = 0;
for(i=0; i<m_maxNode; i++)
{
cout << "-------" << i << "-------" << endl;
cout << "status:" << pNode[i].status << endl;
cout << "seckeyID:" << pNode[i].seckeyID << endl;
cout << "clientID:" << pNode[i].clientID << endl;
cout << "serverID:" << pNode[i].serverID << endl;
cout << "seckey:" << pNode[i].seckey << endl;
}

return;
}