重慶網(wǎng)站建設公司銷售seo營銷推廣多少錢
文章目錄
- 1 外聯(lián)接口
- 1.1 接口類的封裝
- 1.2 共享內(nèi)存與配置文件
- 2 json格式配置文件的定義
- 2.1 共享內(nèi)存中存儲的節(jié)點結構
- 2.2 服務器端配置文件
- 2.3 客戶端配置文件
- 2.4 改進配置文件
- 3 共享內(nèi)存類修改
- 4 將接口打包成庫(靜態(tài)/動態(tài))
- 4.1 相關的指令
- 4.1.1 靜態(tài)庫
- 4.1.2 動態(tài)庫
- 4.2 外聯(lián)接口的實現(xiàn) - 以金融安全傳輸項目為例
- 4.2.1 創(chuàng)建一個空Linux項目
- 4.2.2 將封裝好的類文件加入到項目中
- 4.2.3 在屬性頁中添加庫依賴項
- 4.2.4 配置遠程主機,啟動調(diào)試,確認代碼沒有問題
- 4.2.5 遠程主機上刪掉main.cpp或者test.cpp
- 4.2.6 將剩余的cpp打包成動態(tài)庫
- 5 動態(tài)庫的測試
- 5.1 測試代碼的倉庫:
- 5.1 先啟動秘鑰協(xié)商的客戶端和服務端 ,并查看共享內(nèi)存的狀態(tài)
- 5.2 測試用的客戶端是好的,但是服務端沒法跟共享內(nèi)存關聯(lián)。很奇怪,留一個bug...待解決
1 外聯(lián)接口
1.1 接口類的封裝
// 讀共享內(nèi)存中的秘鑰, 進行對稱加密// des , 3des , aesclass MyInterface{public:// json參數(shù)磁盤的json格式的配置文件MyInterface(string json);~MyInterface();// 數(shù)據(jù)加密// 參數(shù): 待加密的數(shù)據(jù)->明文, 返回值: 密文string encryptData_des(string str);string encryptData_3des(string str);string encryptData_aes(string str);// 數(shù)據(jù)解密// 參數(shù): 待解密的數(shù)據(jù)-密文, 返回值: 明文string decryptData_des(string str);string decryptData_3des(string str);string decryptData_aes(string str);}
- 可以參考這個項目的實現(xiàn),將加解密封各自封裝好
https://github.com/Chufeng-Jiang/OpenSSL_Secure_Data_Transmission_Platform/tree/dev_origin/Module%20Preparation%20and%20Test/07.CryptoTest
1.2 共享內(nèi)存與配置文件
提供的接口不是一個應用程序 -> 不是進程
- 如何從共享內(nèi)存中讀數(shù)據(jù)?
- 雖然接口不是程序, 但是要被業(yè)務程序調(diào)用
- 業(yè)務程序是進程
- 通過業(yè)務程序完成進程間通信
- 業(yè)務程序是進程
- 雖然接口不是程序, 但是要被業(yè)務程序調(diào)用
- 外聯(lián)接口要求必須要通用
- 必須用通過配置文件讀配置信息 -> 找到共享內(nèi)存
2 json格式配置文件的定義
2.1 共享內(nèi)存中存儲的節(jié)點結構
class NodeSecKeyInfo{public:NodeSecKeyInfo() : status(0), seckeyID(0){bzero(clientID, sizeof(clientID));bzero(serverID, sizeof(serverID));bzero(seckey, sizeof(seckey));}int status; // 秘鑰狀態(tài): 1可用, 0:不可用int seckeyID; // 秘鑰的編號char clientID[12]; // 客戶端ID, 客戶端的標識char serverID[12]; // 服務器ID, 服務器標識char seckey[128]; // 對稱加密的秘鑰};
2.2 服務器端配置文件
{"ServerID":"0001", // 當前秘鑰協(xié)商服務器的ID"ClientID":"1111" // 不能寫死,和當前業(yè)務服務器通信的客戶端ID --> 這個是動態(tài)的"ShmKey":"/usr/lib", // 通過 shmKey 打開一塊已經(jīng)存在的共享內(nèi)存"MaxNode":100, // 共享內(nèi)存中存儲的最大節(jié)點數(shù) -> 用于遍歷
}
2.3 客戶端配置文件
{"ServerID":"0001","ClientID":"1111""shmKey":"/usr/local", // 通過 shmKey 打開一塊已經(jīng)存在的共享內(nèi)存"MaxNode":1, // 共享內(nèi)存中存儲的最大節(jié)點數(shù) -> 用于遍歷
}
2.4 改進配置文件
// 將配置文件中的serverID和clientID去掉
// 找秘鑰的方式:- 通過clientID和serverID進行查找- 通過秘鑰ID查找// 通過配置文件打開共享內(nèi)存
{"shmKey":"/usr/local", // 通過 shmKey 打開一塊已經(jīng)存在的共享內(nèi)存"MaxNode":1, // 共享內(nèi)存中存儲的最大節(jié)點數(shù) -> 用于遍歷
}
3 共享內(nèi)存類修改
class SecKeyShm : public BaseShm
{
public:// 打開或創(chuàng)建一塊共享內(nèi)存// 這個操作是在父類中做的SecKeyShm(int key, int maxNode);SecKeyShm(string pathName, int maxNode);~SecKeyShm();void shmInit();int shmWrite(NodeSecKeyInfo* pNodeInfo);NodeSecKeyInfo shmRead(string clientID, string serverID);/**********************************************/NodeSecKeyInfo shmRead(int keyID);// 通過這個函數(shù)讀共享內(nèi)存中的第一個NodeSecKeyInfo// 給客戶端使用// 這個不會NodeSecKeyInfo shmFirstNode();private:int m_maxNode;
};
NodeSecKeyInfo SecKeyShm::shmRead(int keyID)
{int ret = 0;// 關聯(lián)共享內(nèi)存NodeSecKeyInfo* pAddr = NULL;pAddr = static_cast<NodeSecKeyInfo*>(mapShm());if (pAddr == NULL){cout << "共享內(nèi)存關聯(lián)失敗..." << endl;return NodeSecKeyInfo();}cout << "共享內(nèi)存關聯(lián)成功..." << endl;//遍歷網(wǎng)點信息int i = 0;NodeSecKeyInfo info;NodeSecKeyInfo* pNode = NULL;// 通過clientID和serverID查找節(jié)點cout << "maxNode: " << m_maxNode << endl;for (i = 0; i < m_maxNode; i++){pNode = pAddr + i;cout << i << endl;cout << "keyID: " <<keyID << endl;//cout << "clientID 比較: " << pNode->clientID << ", " << clientID.data() << endl;//cout << "serverID 比較: " << pNode->serverID << ", " << serverID.data() << endl;if (pNode->seckeyID == keyID){// 找到的節(jié)點信息, 拷貝到傳出參數(shù)info = *pNode;cout << "++++++++++++++" << endl;cout << info.clientID << " , " << info.serverID << ", "<< info.seckeyID << ", " << info.status << ", "<< info.seckey << endl;cout << "===============" << endl;break;}}unmapShm();return info;
}
4 將接口打包成庫(靜態(tài)/動態(tài))
4.1 相關的指令
4.1.1 靜態(tài)庫
// 生成.o
gcc/g++ *.c/*.cpp -c// 打包.o
ar rcs libxxx.a *.o
4.1.2 動態(tài)庫
# 生成.o -> 和位置無關使用的是相對地址
gcc/g++ *.c/*.cpp -c -fpic
# 生成動態(tài)庫
gcc/g++ -shared *.o -o libxxx.so
4.2 外聯(lián)接口的實現(xiàn) - 以金融安全傳輸項目為例
打包加解密的庫
4.2.1 創(chuàng)建一個空Linux項目
4.2.2 將封裝好的類文件加入到項目中
4.2.3 在屬性頁中添加庫依賴項
這里要注意jsoncpp
的寫法,
如果centos里json動態(tài)庫的名字是libjson.so,那么就是寫json.
因為我在安裝json的時候創(chuàng)建軟連接的名字是libjsoncpp.so,因此這里寫的jsoncpp
jsoncpp;crypto
4.2.4 配置遠程主機,啟動調(diào)試,確認代碼沒有問題
4.2.5 遠程主機上刪掉main.cpp或者test.cpp
4.2.6 將剩余的cpp打包成動態(tài)庫
g++ -c *.cpp -std=c++11 -fpic
g++ -shared *.o -o libinterface.so
將頭文件里的API和libxxx.so
文件發(fā)給用戶就可以了。
5 動態(tài)庫的測試
5.1 測試代碼的倉庫:
在第4部分,打包的動態(tài)庫所在的位置為:/root/projects/Interface
mv libinterface.so /usr/lib/
- 編譯指令
g++ *.cpp -lpthread -L/root/projects/Interface -linterface -ljsoncpp -lcrypto -std=c++11g++ *.cpp -lpthread -linterface -ljsoncpp -lcrypto -std=c++11