예제 #1
0
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);
}
예제 #2
0
파일: client_res.c 프로젝트: deweerdt/TSP
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;
}
예제 #3
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);

}