工作至今已经许久,对于编程的热爱已然有所衰退,需要找一个能持久激励自己的一个途径,或是写公众号其他人的点赞,或是有同志留言需要工程,或是解决了其他朋友的问题。
诸如种种,应该是一个正向螺旋的上升,或许才是长久之计。
进入正题:工作一段时间后,如何把之前用到的小模块组合成一个大的系统?需要自己去总结,去编程,去提炼。大于大多数国内不大的公司,还是用现成的轮子,大厂另当别论。
今天和大家分享的是常见的通信——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;
}
效果图: