int Myconnect_timo(int sockfd, const struct sockaddr *saptr, socklen_t salen, int nsec) { Sigfunc *sigfunc; int n; /* SIGALRM 信号处理函数,并保存现有信号处理函数 */ sigfunc = MySignal(SIGALRM, connect_alarm); /* 设置alarm超时 */ if(alarm(nsec) != 0)/* 若已经设置了超时,则alarm返回的是当前剩余秒数,否则返回0 */ printf("alarm was already set\n");/* 提示:已经设置过alarm超时 */ if( (n = connect(sockfd, saptr, salen)) < 0) {/* 由超时处理函数调用中断导致连接失败,则关闭套接字,并设置是由超时导致的失败 */ close(sockfd); if(errno == EINTR) errno = ETIMEDOUT; } /* 关闭 alarm */ alarm(0); /* 恢复原来的处理函数 */ MySignal(SIGALRM, sigfunc); return(n); }
int main(int argc, char *argv[]){ const TSP_answer_sample_t* information; TSP_sample_symbol_info_list_t symbols[TSP_MAX_SERVER_NUMBER]; int i, count=0; int nb_providers = 0; void* res_values; int new_sample; int provider; int base_frequency = 1e6; TSP_sample_t sample; int res_value_i, res_values_nb; TSP_provider_t providers[TSP_MAX_SERVER_NUMBER]; int buffersBeforeStop = 0; int myopt; /* Options */ char* out_file_res = NULL; int period=1; int test_mode = 1; extern char* optarg; _use_dbl = 0; /* catch ctrl-c */ MySignal(SIGINT, catch_ctrl_c); STRACE_INFO("Autodetect CPU : %zu bits", sizeof(long)*8); /* TSP Init */ if(TSP_STATUS_OK!=TSP_consumer_init(&argc, &argv)) { STRACE_ERROR("TSP init failed"); return -1; } while ((myopt = getopt(argc, argv, "u:f:t:m:dh")) != -1) { switch(myopt) { case 'u': /*-------------------------------------*/ /* Connection to providers, URL based */ /*-------------------------------------*/ if(nb_providers < TSP_MAX_SERVER_NUMBER && (providers[nb_providers] = TSP_consumer_connect_url(optarg))) nb_providers++; else { STRACE_ERROR("Cannot connect to %s", optarg); } break; case 'f': out_file_res = optarg; break; case 't': period = atoi(optarg); break; case 'm': test_mode = atoi(optarg); break; case 'd': _use_dbl = 1; break; case 'h': /* no break please, do as default */ default : usage(argv[0]); break; } } if(!out_file_res) usage(argv[0]); if(nb_providers == 0) { providers[nb_providers++] = TSP_consumer_connect_url(NULL); if(!providers[0]) { STRACE_ERROR("Cannot connect to a TSP provider on local host"); usage(argv[0]); } } for(provider=0; provider<nb_providers; provider++) { /*-------------------------*/ /* Open requested provider */ /*-------------------------*/ if (TSP_STATUS_OK!=TSP_consumer_request_open(providers[provider], 0, 0 )) { STRACE_ERROR("TSP_request_provider_open failed"); return -1; } /*-----------------------------*/ /* TEST : STAGE 002 | STEP 003 */ /*-----------------------------*/ do { if(TSP_STATUS_OK!=TSP_consumer_request_information(providers[provider])) { STRACE_ERROR("TSP_request_provider_information failed"); return -1; } information = TSP_consumer_get_information(providers[provider]); symbols[provider].TSP_sample_symbol_info_list_t_len = information->symbols.TSP_sample_symbol_info_list_t_len; if(!symbols[provider].TSP_sample_symbol_info_list_t_len) tsp_usleep(TSP_NANOSLEEP_PERIOD_US); } while(!symbols[provider].TSP_sample_symbol_info_list_t_len); symbols[provider].TSP_sample_symbol_info_list_t_val = (TSP_sample_symbol_info_t*)calloc(symbols[provider].TSP_sample_symbol_info_list_t_len, sizeof(TSP_sample_symbol_info_t)); TSP_CHECK_ALLOC(symbols[provider].TSP_sample_symbol_info_list_t_val, -1); for( i = 0 ; i< symbols[provider].TSP_sample_symbol_info_list_t_len ; i++) { STRACE_INFO("Id=%d Sym='%s'",i, information->symbols.TSP_sample_symbol_info_list_t_val[i].name); symbols[provider].TSP_sample_symbol_info_list_t_val[i].name = information->symbols.TSP_sample_symbol_info_list_t_val[i].name; symbols[provider].TSP_sample_symbol_info_list_t_val[i].period = period; symbols[provider].TSP_sample_symbol_info_list_t_val[i].phase = 0; } /* chose smallest frequency */ if(information->base_frequency < base_frequency) base_frequency = information->base_frequency; /* take only the first, midle and last variable in 'first_last' mode*/ switch(test_mode) { case 1 : /* all variables */ break; case 2 : symbols[provider].TSP_sample_symbol_info_list_t_val[1] = symbols[provider].TSP_sample_symbol_info_list_t_val[ symbols[provider].TSP_sample_symbol_info_list_t_len/2]; symbols[provider].TSP_sample_symbol_info_list_t_val[2] = symbols[provider].TSP_sample_symbol_info_list_t_val[ symbols[provider].TSP_sample_symbol_info_list_t_len-1]; symbols[provider].TSP_sample_symbol_info_list_t_len = 3; break; case 3 : symbols[provider].TSP_sample_symbol_info_list_t_len = 10; break; default: STRACE_ERROR("Unknown test number"); return -1; } /*-----------------------------------------------*/ /* Adjust period according to smallest frequency */ /*-----------------------------------------------*/ /* TODO */ /*---------------------*/ /* Ask for sample list */ /*---------------------*/ if(TSP_STATUS_OK!=TSP_consumer_request_sample(providers[provider],&symbols[provider])) { STRACE_ERROR("TSP_request_provider_sample failed"); return -1; } } /* in case of stop request, flush N buffers (if any) before stopping */ buffersBeforeStop = base_frequency * 1 /* seconds */; for(provider=0; provider<nb_providers; provider++) { /*----------------*/ /* Start sampling */ /*----------------*/ if (TSP_STATUS_OK!=TSP_consumer_request_sample_init(providers[provider],0,0)) { STRACE_ERROR("TSP_request_provider_sample_init failed"); return -1; } } /*-------------------*/ /* Loop on data read */ /*-------------------*/ STRACE_INFO("file=%s", out_file_res); d_wopen(out_file_res); d_wcom(""); /* No comment */ res_values_nb = 0; for(provider=0; provider<nb_providers; provider++) { for (i = 0; i < symbols[provider].TSP_sample_symbol_info_list_t_len; i++) { d_wnam(symbols[provider].TSP_sample_symbol_info_list_t_val[i].name, "?"); /* write header with no unit */ } res_values_nb += symbols[provider].TSP_sample_symbol_info_list_t_len; } res_values = _use_dbl ? calloc(( res_values_nb+1),sizeof(double)) : calloc(( res_values_nb+1),sizeof(float)) ; assert(res_values); res_value_i = 0; while(!stop_end) { for(provider=0; provider<nb_providers; provider++) { if(TSP_STATUS_OK!=TSP_consumer_read_sample(providers[provider], &sample, &new_sample)) { stop_end = TRUE; break; } if (new_sample) { if(_use_dbl) { double* d_res_values = (double*)res_values; d_res_values[res_value_i++] = sample.uvalue.double_value; } else { float* f_res_values = (float*)res_values; f_res_values[res_value_i++] = sample.uvalue.double_value; } /* Received complete buffer, need to write */ if( res_value_i == res_values_nb ) { count++; d_writ(res_values); res_value_i = 0; /* wait a little before stopping to flush buffers */ if(stop) stop++; if(stop > buffersBeforeStop) stop_end = TRUE; } } else { tsp_usleep(TSP_NANOSLEEP_PERIOD_US); /* no more buffers, stop immediately */ if(stop) stop_end = TRUE; } } } d_clos(); TSP_consumer_end(); return 0; }
int main(int argc, char **argv) { int n; struct addrinfo *ai; char *h; opterr = 0; /* don't want getopt() writing to stderr */ /* 只实现ping的一个参数选项-v供查询 */ /* 有关getopt函数的使用可以查阅相关资料 */ while( (n = getopt(argc, argv, "v")) != -1) { switch(n) { case 'v': verbose++; break; case '?': printf("unrecognize option: %c\n", n); exit(1); } } if(optind != argc-1) { perror("usage: ping [ -v ] <hostname>"); exit(1); } host = argv[optind]; pid = getpid() & 0xffff; /* ICMP ID field is 16 bits */ MySignal(SIGALRM, sig_alrm); MySignal(SIGINT, statistics); /* 将主机名和服务名映射到一个地址,并返回指向addrinfo的指针 */ ai = host_serv(host, NULL, 0, 0); /* 将网络字节序的地址转换为字符串格式地址,并返回该字符串的指针 */ h = Sock_ntop_host(ai->ai_addr, ai->ai_addrlen); /* 显示PING的主机名、地址与数据字节数 */ printf("PING %s (%s) %d bytes of data.\n", ai->ai_canonname ? ai->ai_canonname : h, h, datalen); /* initialize according to protocol */ if(ai->ai_family == AF_INET) { pr = &proto_v4;/* proto结构指针pr指向对应域的结构,这里是IPv4域的结构 */ #ifdef IPV6 }else if(ai->family == AF_INET6) { pr = &proc_v6; if(IN6_IS_ADDR_V4MAPPED(&(((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr))) { perror("connot ping IPv4-mapped IPv6 address"); exit(1); } #endif }else { printf("unknown address family %d", ai->ai_family); exit(1); } pr->sasend = ai->ai_addr;/* 发送地址赋值 */ pr->sarecv = (struct sockaddr *)Calloc(1, ai->ai_addrlen); pr->salen = ai->ai_addrlen;/* 地址的大小 */ /* 处理数据 */ readloop(); exit(0); }