菜鸟笔记
提升您的技术认知

断线重连socket客户端-ag真人游戏

  若服务端先上线就等待客户端连接,客户端则正常连接。当客户端先上线,服务端还没上线,或当服务端掉线时,则客户端不断重新连接服务端,直到服务端上线。服务端与客户端任意一端掉线,能提示掉线。

  服务端为一对一。

  客户端需要开两个线程,一个线程负责不断连接服务器直到成功,若成功连接就进入定时发送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/

网站地图