断线重连socket客户端
若服务端先上线就等待客户端连接,客户端则正常连接。当客户端先上线,服务端还没上线,或当服务端掉线时,则客户端不断重新连接服务端,直到服务端上线。服务端与客户端任意一端掉线,能提示掉线。
服务端为一对一。
客户端需要开两个线程,一个线程负责不断连接服务器直到成功,若成功连接就进入定时发送heartbeat数据来检测服务端是否掉线,掉线则退出发送进入重连;另外一个线程负责接收服务端数据,接收时服务器掉线也马上重连。(用了一个变量来表示是否连接成功,这两个线程都会修改这个变量,就用了互斥锁).
代码:
服务端程序:server.c
客户端程序: client.cpp 仅贴出重连部分代码
void *client_manager::connect_thread(void *arg) { client_manager *thiz = (client_manager *)arg; while (1) { if (thiz->get_connect_status()) { // if (thiz->client_send((void *)"heartbeat", 10) <= 0) // { // thiz->set_connect_stayus(false); // printf(" client:disconnected,retry connect server...\n"); // continue; // } sleep(2); } else { if (thiz->sock_info.socket_fd >= 0) { close(thiz->sock_info.socket_fd); thiz->sock_info.socket_fd = socket(AF_INET, SOCK_STREAM, 0); } if (connect(thiz->sock_info.socket_fd, (struct sockaddr *)&thiz->sock_info.servaddr, sizeof(thiz->sock_info.servaddr)) < 0) { thiz->set_connect_stayus(false); printf(" client :retry connect server(%s:%d)...\n", CONNECT_ADDR, CONNECT_PORT); sleep(2); continue; } else { thiz->set_connect_stayus(true); printf(" client :connect server success\n"); } } } }
源码文件地址:https://github.com/jest549/AppProjectDemo 仓库下目录retryConnect/
分类:
应用实例Sample
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?