Exemplo n.º 1
0
int main(int argc, char **argv)
{
	ifstream fin;
	fin.open(argv[1]);
	ms.InitMS(fin);
	cout<<ms;
    ms.Setsocket();
    int sockfd_tcp, sockfd_udp, maxfd;
    struct sockaddr_in srvaddr;
    fd_set allset, rset;
    socklen_t len = sizeof(struct sockaddr_in);
    sockfd_tcp = ms.Getsockfd_tcp();
    sockfd_udp = ms.Getsockfd_udp();
    maxfd = max(sockfd_tcp, sockfd_udp) + 1;
    FD_ZERO(&allset);
    FD_SET(sockfd_tcp, &allset);
    FD_SET(sockfd_udp, &allset);
    char buf[MAXLINE];
    int i;
    pthread_t tid_probe;
    Pthread_create(&tid_probe, NULL, &probing, NULL); //create an another thread to timely probe the time_sheet in order to find the failed server
    while(1)
    {
        Signal(SIGINT, sig_int_handle);
        Signal(SIGTERM, sig_term_handle);
        if (sigsetjmp(jmpbuf, 1)!=0 || sigsetjmp(jmpbuf, 2)!=0) //if SIGINT or SIGTERM signal caught, master close all sockets and exits
        {
            ms.Closesockets();
            cout<<"Master exits, all sockets are closed"<<endl;
            exit(1);
        }
        rset = allset;
        if ((Select(maxfd, &rset, NULL, NULL, NULL)) < 1) //master listen to its udp socket to receive ping from server
            continue;
        if (FD_ISSET(sockfd_udp, &rset))
        {
            i = recvfrom(sockfd_udp, buf, MAXLINE, 0, (SA*)&srvaddr, &len);
            if (i < 0)
            {
                cerr<<"recv error"<<endl;
                continue;
            }
            else
            {
                pthread_t tid;
                Pthread_create(&tid, NULL, &handle_ping, (void *)buf); //when received server ping, handle it
            }
        }
    }
	return 1;
}