若服务端先上线就等待客户端连接,客户端则正常连接。当客户端先上线,服务端还没上线,或当服务端掉线时,则客户端不断重新连接服务端,直到服务端上线。服务端与客户端任意一端掉线,能提示掉线。
服务端为一对一。
客户端需要开两个线程,一个线程负责不断连接服务器直到成功,若成功连接就进入定时发送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/