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; }