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