# 数据传输项目 **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、选择合适的版本进行安装** ![1559275942019](库的安装和环境配置.assets/202207221643608.png) **2、以下以win32版本安装为例,安装步骤如下:** ![1559276426377](库的安装和环境配置.assets/202207221645784.png) ![1559276607358](库的安装和环境配置.assets/202207221645786.png) ![1559276747288](库的安装和环境配置.assets/202207221645236.png) **3、添加系统环境变量** > 将安装目录下的`bin`添加到系统环境变量中, 方便访问 > ![1559279048729](库的安装和环境配置.assets/202207221645283.png) ## 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, 创建一个空的控制台应用程序 ![1559277446739](库的安装和环境配置.assets/202207281710213.png) ![1559277495386](库的安装和环境配置.assets/202207281710902.png) > 2、设置项目属性, 打开项目的属性面板 ![1559277797989](库的安装和环境配置.assets/202207281710659.png) > 3、添加openssl头文件目录 ![1559277875988](库的安装和环境配置.assets/202207281710895.png) > 4、选择安装目录下的 `include`目录, 里边存储了openssl的头文件 ![1559278029147](库的安装和环境配置.assets/202207281710582.png) > 5、添加openssl的库目录 ![1559278591054](库的安装和环境配置.assets/202207281710190.png) > 6、配置完毕 ![1559278754324](库的安装和环境配置.assets/202207281710861.png) ## VS中使用测试 > 打开项目属性窗口, 添加openssl相关的库到项目中 > > ==**项目属性 -> 链接器 -> 输入 -> 附件依赖项**== > > - **libssl.lib** > - **libcrypto.lib** ![1559278471406](库的安装和环境配置.assets/202207281710642.png) > 测试代码如下: ```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` ``` ### 报错问题 ![image-20220728170746839](库的安装和环境配置.assets/202207281714168.png) 出现上述问题,是库找不到的原因 **方法一:** 1、先找到库的路径 ```shell sudo find / -name "libcrypto.so.10" 或者 sudo find / -name "libcrypto.so" ``` ![image-20220728171721331](库的安装和环境配置.assets/202207281717378.png) 2、将路径添加到环境变量中 ```shell vim /etc/ld.so.conf 比如加入路径:/usr/lib64/libcrypto.so.10 ``` ![image-20220728172034737](库的安装和环境配置.assets/202207281720784.png) 4、保存配置 ```shell sudo ldconfig ``` ![image-20220728172115871](库的安装和环境配置.assets/202207281721909.png) **如果还是不行,看方法二** **方法二:** 1、下载 ```shell yum install openssl openssl-devel ``` ![image-20220728172150577](库的安装和环境配置.assets/202207281721620.png) 2、编译代码运行 ```shell gcc md5_test.c -o md5 -lcrypto /md5 ``` ![image-20220728172317967](库的安装和环境配置.assets/202207281723006.png) # 二、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 工程 ![1559280403078](库的安装和环境配置.assets/202207221651410.png) ![1559280550545](库的安装和环境配置.assets/202207221651467.png) > 执行完这一步之后,需要稍等一小会儿。 ![1559280854739](库的安装和环境配置.assets/202207221652687.png) - 进入 vs2017 工程目录,使用vs2017打开,`F7` 编译 - 编译完成 ,在 vs2017工程目录 /Debug 目录下,可以看到生成的库文件 - 将生成的动态库和头文件放到自定义目录中备用 - 在vs中指定头文件目录和库目录(根据自己上一步实际的存储目录进行指定) - 修改vs其他配置(这个很重要 ) - 修改预处理器定义: - 项目属性->c/c++ -> 预处理器 -> 预处理器定义 添加这个`PROTOBUF_USE_DLLS `宏定义 ### 2、直接使用现成的动态库和头文件 1、找到库文件和头文件 ![image-20220722165956185](库的安装和环境配置.assets/202207221659234.png) 2、将protocbuf添加进系统环境变量中 ![image-20220722170130447](库的安装和环境配置.assets/202207221701485.png) ### 测试 > 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=./ ![image-20220722170824904](库的安装和环境配置.assets/202207221708949.png) **如果没有报错会生成以下文件** ![image-20220722170926389](库的安装和环境配置.assets/202207221709428.png) **如果报错,显示缺少.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=./ ``` ![image-20220728174612562](库的安装和环境配置.assets/202207281746603.png) 编译后生成了如下文件: ![image-20220728174303879](库的安装和环境配置.assets/202207281745102.png) ## VS中使用protocbuf 1、将控制台命令下生成的两个文件添加进VS项目中 2、添加包含目录 ![image-20220722171713207](库的安装和环境配置.assets/202207221717268.png) 3、添加库目录 ![image-20220722171815787](库的安装和环境配置.assets/202207221718841.png) 4、添加动态库 ![image-20220722172141258](库的安装和环境配置.assets/202207221721330.png) 5、添加宏 ![image-20220722172350804](库的安装和环境配置.assets/202207221723879.png) **报错处理** ![image-20220722172512409](库的安装和环境配置.assets/202207221725450.png) ![image-20220722172635776](库的安装和环境配置.assets/202207221726818.png) # 三、JsonCpp的安装 ## windows下的安装JsonCpp 1、在windows下 将 `jsoncpp-0.10.7.tar.gz`解压缩 2、进入到解压目录`jsoncpp-0.10.7`, 在进入到子目录`makefiles\msvc2010` 3、使用`vs`打开项目文件`jsoncpp.sln` 4、编译该项目, 生成库文件 ![1567304880789](库的安装和环境配置.assets/202207241804138.png) 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编译过程中, 修改属性 ![1567311254954](库的安装和环境配置.assets/202207241807201.png) # 四、升级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 ``` 实例: ![image-20220730155259756](库的安装和环境配置.assets/202207301552935.png) ![image-20220730155307431](库的安装和环境配置.assets/202207301553478.png) # 六、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的环境 ![image-20220730160419624](库的安装和环境配置.assets/202207301604725.png) 2、重启Navicat Premium,使配置生效 3、配置windows下即时客户端 instantclient的tnsnames.ora文件 ![image-20220730160557833](库的安装和环境配置.assets/202207301605902.png) 如果没有就创建一个,并输入一下代码 ```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、开始连接 ![image-20220730161610727](库的安装和环境配置.assets/202207301616817.png) ![image-20220730161624227](库的安装和环境配置.assets/202207301616302.png) # 七、QT安装及配置 1、安装qt-opensource-windows-x86-5.9.3.exe 2、选择组件 ![image-20220804194335266](库的安装和环境配置.assets/202208041943393.png) 3、配置Oracle文件 将sqldrivers文件夹内文件拷贝到D:\QT\5.9.3\mingw53_32\plugins\sqldrivers(具体看你自己的安装QT的目录)