在工控上经常用到tcp连接,比如串口服务器或某些支持modbustcp协议的仪表等,以前尽量使用串口服务器的虚拟串口功能,现在逐步使用上了tcpserver或tcpclient模式。
搜索了个C++ 的tcp断线重连的案例(http://www.cnblogs.com/kingdom_0/articles/2571727.html),使用这个的原因还因其使用的是收发多线程。server和client都很全,也许是作者的疏忽,client出现了明显的bug。如果掉线了,client的send和recv将重新建两个socket。
所以send和recv两个线程中的socket必须以指针形式传入,其次关闭socket不能用shutdown。经改进,目前已实现比较完美的断线(断开服务器程序和拔掉网线方式测试)自动连接功能。
完整client代码cpp文件如下:
include
#include
#include
#include
#include
H头文件中代码如下:
#pragma once
#include
#include
#include
#pragma comment(lib,"ws2_32")//Standard socket API.
#include "sendByte.h"//发送属性实体(根据需求自定义变量即可)
#include "TcpDatas.h"//接收属性实体(根据需求自定义变量即可)
#include "Totype.h"//类型转化函数类
class ClientTcp
{
public:
ClientTcp(std::string strIp, unsigned int uPort);
virtual ~ClientTcp();
//初始化网络服务端
bool InitClient();
private:
unsigned int m_uPort;//监听端口
std::string m_strIp;//用于监听本机指定IP地址
};
入口文件中调用:
void TcpClientRun()
{
ClientTcp clienttcp("192.168.124.3", 6100);
if (!clienttcp.InitClient())
{
getchar();
}
}
int main(int argc, char* argv[])
{
std::thread CTcpTh(TcpClientRun);
this_thread::sleep_for(std::chrono::milliseconds(1000));
CTcpTh.join();
return 0;
}
这样就可以了
线程自动锁 ThreadLock.h 选用https://www.cnblogs.com/pilipalajun/p/5415673.html;
本文主要参考原文链接:https://blog.csdn.net/gongzhu110/article/details/83147994