예제 #1
0
static void *handle_ping(void *arg) //master handle ping from server
{
    Pthread_detach(pthread_self());
    char *buf = (char *)arg;
    pair <int, int> srv_name;
    depacketize(buf, srv_name);
    //printf("%s\n",seperator);
    printf("Ping received: 127.0.0.1:%d\n",srv_name.second);
    ms.update_time_sheet(srv_name);
    //ms.display_time_sheet();
    if (!ms.Server_exists(srv_name)) //if the server doesn't exist, it means that new server joined, start chain extension
    {
        printf("New server joined:127.0.0.1:%d, chain extension start\n",srv_name.second);
        Server *s = new Server(srv_name);
        ms.Addserver(s);
        ms.client_notify(srv_name, true);
        ms.server_notify(srv_name, true);
    }
}
예제 #2
0
static void *probing(void *arg) //master probe the time_sheet in every 5 seconds
{
    Pthread_detach(pthread_self());
    while (1)
    {
        sleep(5);
        printf("start probing\n");
        time_t cur_time = time(NULL);
        for(map<pair<int, int>, time_t >::iterator it = ms.Gettimesheet().begin(); it != ms.Gettimesheet().end(); ++it)
        {
            if (cur_time - (it->second) > 5) //if certain server's last ping from now is more than 5 seconds, it means the server fails, start notify client and server the failure
            {
                printf("%s\n",seperator);
                printf("Server 127.0.0.1:%d FAILS\n",it->first.second);
                ms.client_notify(it->first, false);
                ms.server_notify(it->first, false);
                it = ms.Gettimesheet().erase(it);
                if (it == ms.Gettimesheet().end())
                    break;
            }
        }
    }
}