文章目录
- 0. 代码仓库
- 1. 客户端C API
- 2. 客户端C API的封装分析
- 2.1 sckClient_init()和sckClient_destroy()
- 2.2 sckClient_connect
- 2.3 sckClient_closeconn()
- 2.4 sckClient_send()
- 2.5 sckClient_rev()
- 2.6 sck_FreeMem
- 3. 客户端C++ API
- 4. 服务端C API
- 5. 服务端C++
- 6. 客户端和服务端代码框架
- 7.代码实现
- 7.1 服务端代码实现
- 7.2 客户端代码实现
- 完整代码参考代码仓库
0. 代码仓库
https://github.com/Chufeng-Jiang/OpenSSL_Secure_Data_Transmission_Platform
1. 客户端C API
// 客户端
// C API
int sckClient_init();
/* 客户端 连接服务器 */
int sckClient_connect(char *ip, int port, int connecttime, int *connfd);
/* 客户端 关闭和服务端的连接 */
int sckClient_closeconn(int connfd);
/* 客户端 发送报文 */
int sckClient_send(int connfd, int sendtime, unsigned char *data, int datalen);
/* 客户端 接受报文 */
int sckClient_rev(int connfd, int revtime, unsigned char **out, int *outlen); //1
/* 释放内存 */
int sck_FreeMem(void **buf);
/* 客户端 释放 */
int sckClient_destroy();
2. 客户端C API的封装分析
2.1 sckClient_init()和sckClient_destroy()
int sckClient_init(); 可以使用构造函数代替
TcpSocket();
TcpSocket(int fd);
~TcpSocket();
2.2 sckClient_connect
- 由于几乎所有的API都有参数
int *connfd
,所以直接将其设置一个私有的成员变量,并且从所有的API参数列表中移除。- C++使用string来拷贝字符串比char方便
/* 客户端 连接服务器 */
int sckClient_connect (char *ip, int port, int connecttime, int * );connfd
int conectToHost(string ip, unsigned short port, int connecttime)
int m_connfd;
2.3 sckClient_closeconn()
/* 客户端 关闭和服务端的连接 */
int sckClient_closeconn(int connfd );
int disConnect();
2.4 sckClient_send()
unsigned char *data
,int datalen
是要发送的数据,直接修改为string sendMsg
/* 客户端 发送报文 */
int sckClient_send(int connfd, int sendtime, unsigned char *data, int datalen);
int sendMsg(string sendMsg, int sendtime = 10000)
2.5 sckClient_rev()
/* 客户端 接受报文 */
int sckClient_rev(int connfd, int revtime, unsigned char **out, int *outlen);
string recvMsg(int timeout)
2.6 sck_FreeMem
/* 释放内存 */
int sck_FreeMem(void **buf);
3. 客户端C++ API
// 创建TcpSocket对象 == 一个连接, 这个对象就可以和服务器通信了, 多个连接需要创建多个这样的对象
class TcpSocket
{
public:
TcpSocket();
TcpSocket(int fd);
~TcpSocket();
/* 客户端 连接服务器 */
int conectToHost(string ip, unsigned short port, int connecttime);
/* 客户端 关闭和服务端的连接 */
int disConnect();
/* 客户端 发送报文 */
int sendMsg(string sendMsg, int sendtime = 10000);
/* 客户端 接受报文 */
string recvMsg(int timeout);
private:
int m_connfd;
}
4. 服务端C API
// 服务器端
/* 服务器端初始化 */
int sckServer_init(int port, int *listenfd);
int sckServer_accept(int listenfd, int timeout, int *connfd);
/* 服务器端发送报文 */
int sckServer_send(int connfd, int timeout, unsigned char *data, int datalen);
/* 服务器端端接受报文 */
int sckServer_rev(int connfd, int timeout, unsigned char **out, int *outlen); //1
int sckServer_close(int connfd);
/* 服务器端环境释放 */
int sckServer_destroy();
5. 服务端C++
// 这个类不能用, 因为只能和一个客户端建立连接
class TcpServer
{
public:
// 初始化监听的套接字: 创建, 绑定, 监听
TcpServer();
~TcpServer(); // 在这里边关闭监听的fd
int acceptConn(int timeout);
/* 服务器 发送报文 */
int sendMsg(string sendMsg, int sendtime = 10000);
/* 服务器 接受报文 */
string recvMsg(int timeout);
int disConnect(); // 和客户端断开连接
private:
int m_lfd; // 监听的文件描述符
int m_connfd; // 通信的文件描述符
}