多语言展示
当前在线:582今日阅读:86今日分享:14

如何使用socket 实现一个断开重连功能的客户端

个人工作中开发可靠性较高的上位机程序,下位机有PLC和扫描枪以及多种网络连接设备,开发的基本要求是要实现断开重连,以应对使用过程中的设备连接异常。比如使用到的一种基于以太网连接的扫码枪,通信采用标准的TCP通信协议,使用原始socket不需要写很多代码就可实现此断开重连的功能,本文将此工作经验奉献给有需要的读者朋友们,希望能够帮到您。
工具/原料
1

socket编程基础知识

2

win32 线程的基础知识,VC++ 开发知识

方法/步骤
1

设计总纲:创建一个线程用于循环读写socket,如果读写错误或无法建立连接,继续下一个循环。伪代码为:CSimpleSocket * client;bool success=false;while(1){  Sleep(1000);  if (!success)  {       success=client->connect();        if(!success)             delete success;         }else  {     success=client->readSometh();      if(!success)           delete client;  }}

2

先设计一个简单的socket 类,我这里命名为CSimpleSocket,此类的成员函数有 创建连接和读写数据,分别为connect 和GetSN (CString& sn)。两个成员函数返回值都是bool值,在出错时返回false。注意在创建连接时要设置连接属性,设置超时连接,不然recv函数会阻塞,导致GetSN函数挂起。设置连接属性的函数为setsocktopt。

3

创建一个线程,用于循环读写socket,在此socket 出现读写错误或者断开连接时,重新调用connect 成员函数进行连接。我使用的是MFC开发,所以这个线程从CWinThread派生,重载 InitInstance 函数,实现具体的循环读写功能即可。

4

这个线程函数的原型很简单,具体功能都在InitInstance中实现。

5

在程序初始化时创建线程,开始工作。CScanThread *pScanThread=new CScanThread(this); pScanThread->CreateThread();

6

验证:从网上找一个Socket服务端程序,配好监听端口,开启服务,可以验证此程序的功能是否ok。本人开发的上位机程序验证是没有问题的。

注意事项
1

如有疑问可以留言

2

如果有幸帮到了您,请投票+点赞

推荐信息