void Master::server_notify(pair <int, int> srv, bool extension) //notify server of server fail/chain extension
{
    Server *prev = Search_Prev_Server(srv, !extension);
    cal_next(srv.first);
    if (prev == NULL)
    {
        printf("Head server fails, the successor automatically becomes the new head\n");
        return;
    }
    else
    {
        
        //printf("previous server is %d\n", prev->GetserverName().second);
        socklen_t len = sizeof(sockaddr_in);
        char send_msg[MAXLINE];
        Server *next = Search_Next_Server(prev);
        if (next == NULL)
        {
            srv.second = -1;
        }
        else
        {
            srv.second = next->GetserverName().second;
        }
        packetize(send_msg, srv, false, extension);
        Sendto(sockfd_udp, send_msg, MAXLINE, 0, (SA*)&(prev->Getsockaddr()), len);
        if (extension)
            printf("New server extended to the tail of chain %d\n%s\n", srv.first, seperator);
        else if (srv.second == -1)
            printf("Tail server fails, server notification sent out to its precessor: 127.0.0.1:%d\n", prev->GetserverName().second);
        else
            printf("Internal server fails, server notification sent out to its precessor: 127.0.0.1:%d, new next server is 127.0.0.1:%d\n", prev->GetserverName().second, srv.second);
    }
}
 int KMP(char *haystack, char *needle){
     int l_h = strlen(haystack);
     int l_n = strlen(needle);
     vector<int> next(l_n, 0);
     cal_next(next, needle);
     int i_h = 0;
     int i_n = 0;
     while(i_h < l_h && i_n < l_n){
         if(i_n == -1 || *(needle+i_n) == *(haystack+i_h)){
             i_n++;
             i_h++;
         }else{
             i_n = next[i_n];
         }
     }
     return i_n==l_n ? i_h-i_n : -1;
 }