在工控上经常用到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
来源地址:https://blog.csdn.net/qiuyuanxiang1230/article/details/130487710
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341