Linux应用框架cpp-tbox之TCP通信(下篇)
cpp-tbox项目链接 https://gitee.com/cpp-master/cpp-tbox
更多精彩内容欢迎关注微信公众号:码农练功房
往期精彩内容:
Linux应用框架cpp-tbox之弱定义
Linux应用框架cpp-tbox之日志系统设计
Linux应用框架cpp-tbox之事件驱动EventLoop
Linux应用框架cpp-tbox之事件驱动Event
Linux应用框架cpp-tbox之线程池
Linux应用框架cpp-tbox之应用层缓冲
Linux应用框架cpp-tbox之串口通信
Linux应用框架cpp-tbox之TCP通信(上篇)
本篇涉及的内容主要为TCP客户端的实现。
使用示例
TcpClient client(sp_loop);
client.initialize(bind_addr);
client.start();client.setReceiveCallback([&] (Buffer &buff) {}, 0);client.setConnectedCallback([&] {});client.setDisconnectedCallback([&] {});vector<uint8_t> raw_data{0x01, 0x02, 0x03};
client.send(raw_data.data(), raw_data.size());
用户使用起来十分简单,一般设置三个回调函数即可。
整体结构图
下图为TCP Client的软件结构图:
其结构和TCP Server类似,不同的是:
- TCP Server包含多个TcpConnection,而TCP Client仅包含一个。
- TCP Server包含一个TcpAcceptor对象,到TCP Client这里,包含的是TcpConnector。
TcpClient创建并控制TcpConnector对象的生命周期。
TcpConnection对象由TcpConnector创建,但是其生命周期由TcpClient控制。
TcpClient、TcpConnector对象都是可以重复使用的,而TcpConnection对象会随着TCP建立、断开、重连而不断构造、析构。
建立连接
对于客户端,建立连接是主动发起的。和服务端相比,客户端连接建立要复杂一些,难点在于错误处理、重试和重连。
而且由于socket fd是一次性的,一旦出错,就无法恢复,只能关闭文件描述符重来。
TcpClient::start()接口被调用后,发起连接,具体连接功能委托给TcpConnector实现,具体在TcpConnector::enterConnectingState中处理:
void TcpConnector::enterConnectingState()
{//! 创建SocketSocketFd new_sock_fd = createSocket(server_addr_.type());if (new_sock_fd.isNull())return;LogDbg("server_addr:%s", server_addr_.toString().c_str());//! 连接 server_addr_ 指定的地址int conn_ret = connect(new_sock_fd, server_addr_