# 数据传输项目
**Repository Path**: king799/data-transmission-project
## Basic Information
- **Project Name**: 数据传输项目
- **Description**: 用于数据传输,客户端于服务器之间密钥交换;数据加密传输
- **Primary Language**: C++
- **License**: GPL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 1
- **Created**: 2022-08-17
- **Last Updated**: 2024-01-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 前情提示!!!!
**注意:可以自己配置,也可以使用的安装配置好的Centos7**
详情请看安装包下:Centos7
```c
------- 虚拟机账号 -------
用户名 密码
oracle oracle
root root
------- oracle 数据库 --------
用户名: system 密码: System11g
```
# 一、openssl的安装和使用
## windows下安装openssl
> 下载地址: http://slproweb.com/products/Win32OpenSSL.html
>
> 或者直接使用安装包中文件安装
**1、选择合适的版本进行安装**

**2、以下以win32版本安装为例,安装步骤如下:**



**3、添加系统环境变量**
> 将安装目录下的`bin`添加到系统环境变量中, 方便访问
>

## Linux下安装OpenSSL
1. 下载安装包, 下载地址:
2. 源码安装包解压缩
- openssl-1.1.1c.tar.gzip 解压:
```shell
$ tar zxvf openssl-1.1.1c.tar.gzip
# 加压完成得到目录: openssl-1.1.1c
```
3. 进入解压目录`openssl-1.1.1c`, 安装(可参考安装文件INSTALL):
```shell
$ ./config
$ make
$ make test (可选)
$ sudo make install (使用管理员权限执行该命令)
```
4. 验证是否安装成功
```shell
$ openssl version -a
openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
# 根据之前讲的动态库知识解决动态库找不到的问题。
```
> 执行命令, 正确的输出结果:
```shell
$ openssl version -a
OpenSSL 1.1.1c 28 May 2019
built on: Fri May 31 03:54:40 2019 UTC
platform: linux-x86_64
options: bn(64,64) rc4(16x,int) des(int) idea(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -DNDEBUG
OPENSSLDIR: "/usr/local/ssl"
ENGINESDIR: "/usr/local/lib/engines-1.1"
Seeding source: os-specific
```
## VS中使用openssl
> 1、打开VS, 创建一个空的控制台应用程序


> 2、设置项目属性, 打开项目的属性面板

> 3、添加openssl头文件目录

> 4、选择安装目录下的 `include`目录, 里边存储了openssl的头文件

> 5、添加openssl的库目录

> 6、配置完毕

## VS中使用测试
> 打开项目属性窗口, 添加openssl相关的库到项目中
>
> ==**项目属性 -> 链接器 -> 输入 -> 附件依赖项**==
>
> - **libssl.lib**
> - **libcrypto.lib**

> 测试代码如下:
```c
#define _CRT_SECURE_NO_WARNINGS
#include // md5 头文件
#include
#include
#include
void getMD5(const char* str, char* result)
{
MD5_CTX ctx;
// 初始化
MD5_Init(&ctx);
// 添加数据
MD5_Update(&ctx, str, strlen(str));
// 计算结果
unsigned char md[16] = { 0 };
MD5_Final(md, &ctx);
for (int i = 0; i < 16; ++i)
{
sprintf(&result[i * 2], "%02x", md[i]);
}
}
int main()
{
char result[33] = { 0 };
getMD5("hello, md5", result);
printf("md5 value: %s\n", result);
system("pause");
return 0;
}
```
```shell
#输出结果:
`md5 value: 33b3bc8e05b4fcc16bd531dd9adac166`
```
## Linux下的使用和测试
1. 编程应用程序, 测试代码如上, 文件名为 `md5_test.c`
2. 通过gcc编译源文件
```shell
# 使用的动态库: libcrypto.so
$ gcc md5_test.c -o md5 -lcrypto
1、执行该命令, 需要加载openssl的动态库
- libssl.so
- libcrypto.so
2、运行可执行程序
#输出结果:
`md5 value: 33b3bc8e05b4fcc16bd531dd9adac166`
```
### 报错问题

出现上述问题,是库找不到的原因
**方法一:**
1、先找到库的路径
```shell
sudo find / -name "libcrypto.so.10"
或者
sudo find / -name "libcrypto.so"
```

2、将路径添加到环境变量中
```shell
vim /etc/ld.so.conf
比如加入路径:/usr/lib64/libcrypto.so.10
```

4、保存配置
```shell
sudo ldconfig
```

**如果还是不行,看方法二**
**方法二:**
1、下载
```shell
yum install openssl openssl-devel
```

2、编译代码运行
```shell
gcc md5_test.c -o md5 -lcrypto
/md5
```

# 二、protobuf的安装
## windows下安装protobuf
### 1、自己安装
**嫌麻烦可以直接看第二个方法,直接使用现成的动态库和头文件**
1、安装protobuf
> 下载protobuf的C++版本的源代码,地址:https://github.com/google/protobuf/releases
2、下载 protobuf-cpp-3.8.0.zip/tar.gz 这个
3、解压源码 (路径不要带中文)
4、安装cmake,下载地址:https://cmake.org/download/
5、使用cmake 生成 vs2017 工程


> 执行完这一步之后,需要稍等一小会儿。

- 进入 vs2017 工程目录,使用vs2017打开,`F7` 编译
- 编译完成 ,在 vs2017工程目录 /Debug 目录下,可以看到生成的库文件
- 将生成的动态库和头文件放到自定义目录中备用
- 在vs中指定头文件目录和库目录(根据自己上一步实际的存储目录进行指定)
- 修改vs其他配置(这个很重要 )
- 修改预处理器定义:
- 项目属性->c/c++ -> 预处理器 -> 预处理器定义 添加这个`PROTOBUF_USE_DLLS `宏定义
### 2、直接使用现成的动态库和头文件
1、找到库文件和头文件

2、将protocbuf添加进系统环境变量中

### 测试
> 1、将以下文件写进一个以protoc为后缀的文件中
```protobuf
syntax = "proto3";
message Person{
int32 i =1;
string nam=2;
string sex=3;
int32 age=4;
}
```
> 2、进入该文件的目录,cmd打开控制台输入以下命令
>
> protoc .\Person.protoc --cpp_out=./

**如果没有报错会生成以下文件**

**如果报错,显示缺少.dll文件**
> 方法一:将缺少的库文件或者都文件添加进环境变量中,即将**C:\protocbuf\include**或者**C:\protocbuf\lib**添加进系统环境变量;
>
> 方法二:也可也直接将缺少的文件直接拖进bin目录下,缺少的文件在include或者lib文件下即可找到
## 在linux下的安装
参考资料:
- 1、下载源码安装包: `protobuf-cpp-3.8.0.tar.gz`
- 2、解压缩
```shell
$ tar zxvf protobuf-cpp-3.8.0.tar.gz
```
- 3、安装 -> 进入到解压目录
```shell
$ cd protobuf-3.8.0
$ ./configure
$ make
$ make check (可选)
$ sudo make install
```
## Linux中使用protocbuf
1、编写Persion.protoc
```protobuf
syntax = "proto3";
message Persion
{
int32 id = 1;
bytes name = 2;
int32 age =3;
}
```
2、编译
```shell
protoc ./Persion.protoc --cpp_out=./
```

编译后生成了如下文件:

## VS中使用protocbuf
1、将控制台命令下生成的两个文件添加进VS项目中
2、添加包含目录

3、添加库目录

4、添加动态库

5、添加宏

**报错处理**


# 三、JsonCpp的安装
## windows下的安装JsonCpp
1、在windows下 将 `jsoncpp-0.10.7.tar.gz`解压缩
2、进入到解压目录`jsoncpp-0.10.7`, 在进入到子目录`makefiles\msvc2010`
3、使用`vs`打开项目文件`jsoncpp.sln`
4、编译该项目, 生成库文件

5、生成的静态库存储目录`jsoncpp-0.10.7\makefiles\msvc2010\Debug`
6、生成的静态库文件: `lib_json.lib`
## Linux下的安装JsonCpp
1、准备安装包
- `jsoncpp-0.10.7.tar.gz`
- `scons-3.0.5.zip`
2、解压缩
```shell
$ tar zxvf jsoncpp-0.10.7.tar.gz
$ unzip scons-3.0.5.zip
```
3、安装scons -> 进入 `scons-3.0.5.zip` 的解压目录
```shell
$ python setup.py install
```
4、安装 jsoncpp -> 进入 `jsoncpp-0.10.7.tar.gz` 的解压目录
```shell
$ scons platform=linux-gcc
# 将生成的动态库/静态库拷贝到系统的库目录中, 需要管理员权限
$ sudo cp libs/linux-gcc-4.8.5/* /lib
# 拷贝json的头文件到系统目录中, 需要管理员权限
$ cp include/json/ /usr/include/ -r
# 创建动态库的链接文件, 需要管理员权限
ln -s /lib/libjson_linux-gcc-4.8.5_libmt.so /lib/libjson.so
# 更新, 这样才能搜索到动态库 libjson.so。需要管理员权限
$ ldconfig
# 测试
$ ./bin/linux-gcc-4.8.5/test_lib_json
Testing ValueTest/checkNormalizeFloatingPointStr: OK
Testing ValueTest/memberCount: OK
Testing ValueTest/objects: OK
Testing ValueTest/arrays: OK
..................
Testing BuilderTest/settings: OK
Testing IteratorTest/distance: OK
Testing IteratorTest/names: OK
Testing IteratorTest/indexes: OK
All 53 tests passed
```
5、编译 c++ 测试文件: json-test.cpp
```shell
$ g++ json-test.cpp -ljson -o json
```
## VS中使用JsonCpp
1、将静态库`lib_json.lib`拿出备用
2、将库对应的头文件拿出, 头文件目录`jsoncpp-0.10.7\include\json`
3、vs编译过程中, 修改属性

# 四、升级gcc
## gcc 7.3
```shell
$ yum -y install centos-release-scl
$ yum -y install devtoolset-7-gcc devtoolset-7-gcc-c++ devtoolset-7-binutils
$ scl enable devtoolset-7 bash
```
> 需要注意的是scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本。
> 如果要长期使用gcc 7.3的话:
```shell
$ echo "source /opt/rh/devtoolset-7/enable" >>/etc/profile
```
# 五、oracle服务器配置
## Linux下安装即时客户端及配置
1、将CentOs下的oracle即时客户端oracle_client_11gR2.tar在Centos7 ==/opt==目录下解压
```c
tar zxvf oracle_client_11gR2.tar
```
2、配置Oracle客户端环境
```c
//打开profile文件
vim /etc/profile
//将下面代码保存至文件夹内
# OCCI_HOME 该环境变量的路径需要做对应修改
export OCCI_HOME=/opt/instantclient_11_2
export OCCI_INCLUDE_DIR=$OCCI_HOME/sdk/include
export OCCI_LIBRARY_PATH=$OCCI_HOME
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$OCCI_LIBRARY_PATH
# 程序编译是搜索的库目录
export LIBRARY_PATH=$LIBRARY_PATH:$OCCI_LIBRARY_PATH
# 程序编译时搜索的头文件目录
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$OCCI_INCLUDE_DIR
//保存文件退出,启用配置
. /etc/profile
```
3、配置监听文件
```c
//1、进入/opt/instantclient_11_2/network/admin文件夹
//2、tnsnames.ora文件输入以下代码
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 你的IP地址(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
//3、在listener.ora文件输入以下代码
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST 你的IP地址)(PORT = 1521))
)
)
ADR_BASE_LISTENER = /opt/oracle
```
## Windows下安装Oracle即时客户端及配置
1、将windows下的oracle即时客户端(instantclient_11_2).rar解压
2、进入该文件,创建 network/admin文件夹
3、在admin文件夹下创建tnsnames.ora文件
4、在tnsnames.ora文件输入下列代码
```c
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 你主机的IP地址)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
```
## Oracle服务器端配置
### 1、关闭防火墙
> 如果想要通过外部客户端连接oracle服务器, 必须先关闭防火墙。
>
**通过linux命令关闭centos防火墙:**
- **第一种方式:**
```shell
# 工具 iptables
# 安装工具iptables
#步骤如下:
# 1、切换到root用户, -代表用户的环境变量一并切换
su - root
#2、安装iptables工具
yum install iptables
# 3、查看防火墙状态
service iptables status
# 4、打开防火墙
service iptables start
# 5、关闭防火墙
service iptables stop
```
- **第二种方式 ->常用**
```shell
# 操作系统自带的, 不需要安装任何工具
# 假设防火墙默认是开启的, 使用关闭命令关闭之后, 再重启系统, 防火墙还是启动的
#一、临时设置
#1、查看防火墙
systemctl status firewalld
# 2、启动防火墙 -> 临时设置, 重启系统会回复为默认设置
systemctl start firewalld
# 3、关闭防火墙 -> 临时设置, 重启系统会回复为默认设置
systemctl stop firewalld
# 二、永久设置
# 1、防火墙启动
systemctl enable firewalld
# 2、防火墙关闭
systemctl disable firewalld
```
### 2、启动CentOs7数据库
> 必须登录到oracle用户, 通过oracle用户对数据进行启动
1、启动数据库
```shell
#1、登录orcale用户
su - oracle
#2、登录oracle,看需求登录
#2、1本地登录不需要账号和密码
sqlplus / as sysdba
#2、2远程登录需要
sqlplus sys/sys as sysdba
# 2、3通过sqlplus进行连接
# 使用dba身份登录oracle的时候是不对密码进行验证的, 用户名使用system
# 使用dba身份登录, 如果指定的用户名不是system也会默认使用system身份登录
sqlplus 用户名/密码 as sysdba
sqlplus sys/sys as sysdba
# 3、启动数据库
SQL> startup
输出如下:
ORACLE instance started.
Total System Global Area 759943168 bytes
Fixed Size 2217224 bytes
Variable Size 549456632 bytes
Database Buffers 205520896 bytes
Redo Buffers 2748416 bytes
Database mounted.
Database opened.
```
### 3、关闭数据库
```shell
SQL> shutdown immediate #immediate立即关闭
输出如下:
Database closed.
Database dismounted.
ORACLE instance shut down.
```
### 4、退出数据库
```shell
#退出数据库
SQL>quit
输出如下:
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing option
s
```
### 5、设置tns监听
```shell
#设置监听开始/停止
$ lsnrclt start/stop
#启动监听服务,保证远程客户端可以连接上
lsnrctl start
```
> 如果上述操作失败:
```shell
启动tns监听失败:
# 当前是oracle用户, 切换到root 用户
hostname oracle
# 退出root用户
exit
# 启动tns监听
lsnrclt start
```
### 6、解锁用户实例
```shell
#1、退出,进去oracle用户
[oracle@192 ~]$ exit
登出
有停止的任务。
#2、以管理员方式登录
[oracle@192 ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Sat Jul 30 14:27:09 2022
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
#3、解锁用户
SQL> alter user scott account unlock
2 ;
User altered.
#4、修改用户密码
SQL> alter user scott identified by 11; #修改密码为11
```
实例:


# 六、Navicat Premium远程连接Oracle
## 1、注意
- Navicat Premium必须安装32位的,windows的安装的**即时客户端 instantclient**(oracle的即使客户端)也是32位的,与之对应,才能使用**即时客户端 instantclient**中的**oci.dll**文件,不然会发生dll文件报错。
- 连接前务必打开数据库,设置监听
- 保证 tnsnames.ora 文件中的host是Centos7的本机IP地址,以及保证Centos7中的tnsnames.ora文件与windows即时客户端 instantclient安装包中的tnsnames.oral的代码一样。
- 确保防火墙已经关闭
- 确保查端口号1521已经开启
## 2、连接步骤
1、配置Navicat Premium的环境

2、重启Navicat Premium,使配置生效
3、配置windows下即时客户端 instantclient的tnsnames.ora文件

如果没有就创建一个,并输入一下代码
```c
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = CentOs7本机ip地址)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
```
4、查看Centos7中的tnsnames.ora文件与上述对应
```c
#1、进入root用户
su - root
#2、输入密码
#3、打开tnsnames.ora,与windows下的tnsnames.ora对比
vim /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
#4、保存退出
:wq
```
5、打开CentO7数据库,开启监听
```
#1、切换oracle用户
su - oracle
#2、管理员进入数据库
sqlplus sys/sys as sysdba
#3、开启数据库
SQL> startup
#4、退出数据库
quit;
#5、开启监听
lsnrctl start
```
6、开始连接


# 七、QT安装及配置
1、安装qt-opensource-windows-x86-5.9.3.exe
2、选择组件

3、配置Oracle文件
将sqldrivers文件夹内文件拷贝到D:\QT\5.9.3\mingw53_32\plugins\sqldrivers(具体看你自己的安装QT的目录)