int icmp_select_best_ip(char ip_list[][16], int ip_num, char *best_ip) { int sockfd = 0; struct timeval time_delay, min_time; struct sockaddr_in from_addr; char *cur_ip = NULL, *best = NULL, ip_str[16] = {'\0'}; int ip_idx = 0; if(!ip_list || !best_ip || ip_num <= 1) return -1; sockfd = icmp_socket(); if(sockfd < 0){ perror("socket error"); return sockfd; } min_time.tv_sec = 0x0FFFFFFF; min_time.tv_usec = 0x0FFFFFFF; while(1) { if(ip_idx >= ip_num) break; cur_ip = ip_list[ip_idx]; if(!cur_ip) break; select_best_ip(sockfd, cur_ip, &time_delay, &from_addr); printf("%s %ld %ld \n", cur_ip, time_delay.tv_sec, time_delay.tv_usec); if(tv_min(&time_delay, &min_time)){ memset(ip_str,0,sizeof(ip_str)); strncpy(ip_str, inet_ntoa(from_addr.sin_addr), strlen(inet_ntoa(from_addr.sin_addr))); best = ip_str; } ++ip_idx; } close(sockfd); if(best) strcpy(best_ip, best); else return -1; return 0; }
int tm_min_left_overall (struct timeval *min_result) { int i; int nexp; struct timeval left; nexp = 0; tv_set (min_result, HUGE_TV_SEC, 0); for (i = 0; i < table_used_; i++) if (is_used (table_, i)) { if (!tmout_left (i, &left)) nexp++; tv_min (min_result, min_result, &left); } return nexp; }