构建自己的编程库(一)——asio client

2023-08-26 08:56:18 浏览数 (1)

工作至今已经许久,对于编程的热爱已然有所衰退,需要找一个能持久激励自己的一个途径,或是写公众号其他人的点赞,或是有同志留言需要工程,或是解决了其他朋友的问题。

诸如种种,应该是一个正向螺旋的上升,或许才是长久之计。

进入正题:工作一段时间后,如何把之前用到的小模块组合成一个大的系统?需要自己去总结,去编程,去提炼。大于大多数国内不大的公司,还是用现成的轮子,大厂另当别论。

今天和大家分享的是常见的通信——TCP&Client,使用的是asio库。对于TCP通讯,一种流式通讯,必然会有粘包情况,对于几十字节的小数据量,姑且先不考虑这些,解决主要矛盾——又好又快地完成领导的任务。对于粘包这些甚至可以单独写几篇文章来说明。

我用的这个版本已经不知道是哪个了。。。

github仓库链接:https://github.com/chriskohlhoff/asio。

干货:

整体功能介绍:封装asio client库,

①可以实例化多个client对象

②服务器断开使用回调函数接收信号

③接收服务器数据使用回调函数接收

凑字数:

代码语言:javascript复制
#include "mytcpclient.h"
#include <iostream>


#define SERVER_IP   "192.168.100.7"
#define SERVER_PORT "520"


MyTcpClient::MyTcpClient(std::string ip, std::string port)
{   
    connect_success_ = init(ip, port);
}

bool MyTcpClient::init(std::string ip, std::string port)
{
    bool ret = false;
    ret = tcp_client_.connect(ip, port);
    if(!ret) {
        std::cout << "client.connect failed "  << std::endl;
    }else {
        tcp_client_.setOnReceiveCallback(std::bind(&MyTcpClient::clientOnRecv, this,
                                                std::placeholders::_1,std::placeholders::_2));
        tcp_client_.setOnCloseCallback(std::bind(&MyTcpClient::clientOnClose, this));
    }

    return ret;
}

void MyTcpClient::uninit()
{
    std::cout << "clear resource !" << std::endl;
}

bool MyTcpClient::connectSuccess()
{
    return connect_success_;
}

int MyTcpClient::sendData(std::string data)
{
    if (connect_success_) {
        return tcp_client_.doWrite(data.c_str(), data.size());
    }
}

void MyTcpClient::clientOnRecv(const char *data, int len)
{
    std::string str(data);
    std::cout << "recv data is: " << str << std::endl;
}

void MyTcpClient::clientOnClose()
{
    connect_success_ = false;
    std::cout << "server is over " << std::endl;
}

效果图:

0 人点赞