0

このプログラムは UDP メッセージを送信し、タイムアウトする前に応答を待ちます。select を使用してタイムアウトを制御しました。ただし、ローカル変数「total_latency」がwhileループ内でリセットされる理由はわかりません。

" * ** * ** * *** total_latency" と "^^^^^^^^^^^^^^^^^^^ total_latency" の両方が正しい結果を表示します。ただし、「###################### total_latency」は常に 0 を示します。値がリセットされたようです。誰もこれについて手がかりを持っていますか? それはselect()によるものですか?


出力 :

############## total_latency:0.000

UDP Ping 0 を送信しています....

UDP Ping エコーを待機しています....

レイテンシ[0]: 2.931ms

** * ** * **** total_latency:2.931、i=0

^^^^^^^^^^^^^^^^^^^^^^ トータルレイテンシー:2.931

############## total_latency:0.000

UDP Ping 1 を送信しています....

UDP Ping エコーを待機しています....

レイテンシ[1]: 3.066ms

** * ** * **** total_latency:3.066、i=1

^^^^^^^^^^^^^^^^^^^^^^ トータルレイテンシー:3.066

############## total_latency:0.000

UDP Ping 2 を送信しています....

UDP Ping エコーを待機しています....

レイテンシ[2]: 3.340ms

** * ** * **** total_latency:3.340、i=2

^^^^^^^^^^^^^^^^^^^^^^ トータルレイテンシー:3.340


static int SendUDPPing(int udpSocket) 
{

  int i=0, loop = NUM_PING_PROBING;
  char szBuf[500];
  double diff[NUM_PING_PROBING];
  double total_latency=0;
  struct timeval start_time[NUM_PING_PROBING], end_time[NUM_PING_PROBING];  

  int nSelect = 0;
  fd_set rfds;
  struct timeval timeout;           

  FD_ZERO(&rfds);
  FD_SET(udpSocket, &rfds);
  timeout.tv_sec = 0;             
  timeout.tv_usec = 300000;       

  while(i < loop)
    {

      fprintf(stderr, "#####################  total_latency:%.3f\n",
              total_latency);

      fprintf(stderr, "Sending UDP Ping %d....\n", i);

      gettimeofday(&start_time[i], NULL);

      nRet = send(udpSocket, "ping", strlen("ping"), 0);
      if (nRet < 0)
        {
          fprintf(stderr, "%s UDP Packet send error\n", __func__);
          return WBEST_ERR_FAIL;
        }

      fprintf(stderr, "Waiting for UDP Ping echo....\n");

      memset(szBuf, 0, sizeof(szBuf));
      nSelect = select(udpSocket+1, &rfds, NULL, NULL, &timeout);
      if ( nSelect < 0)
        {      
          fprintf(stderr, "%s: select() failed.\n", __func__);
          break;
        } 
      else if (nSelect == 0)
        {      
          fprintf(stderr,
                  "%s: Receiving UDP PING echo packets timeout (300 ms).\n",
                  __func__);
          break;
        }
      else
        {
          nRet = recv(udpSocket, szBuf, sizeof(szBuf), 0);      
          if (nRet < 0)
            {
              fprintf(stderr, "%s UDP Packet recv error\n", __func__);
              return WBEST_ERR_FAIL;
            }

          gettimeofday(&end_time[i], NULL);

          //fprintf(stderr, "start %lds %ldus, end %lds %ldus\n",
                    start_time[i].tv_sec, start_time[i].tv_usec,
                    end_time[i].tv_sec, end_time[i].tv_usec); 

          if (end_time[i].tv_usec < start_time[i].tv_usec)
            {
              end_time[i].tv_sec -= 1;
              end_time[i].tv_usec += 1000000;
            }
          diff[i] = ( (double)(end_time[i].tv_sec - start_time[i].tv_sec)
                      *(double)1000)
                      + ((double)(end_time[i].tv_usec
                                  - start_time[i].tv_usec)
                         / (double)1000);

          total_latency = total_latency + diff[i];

          fprintf(stderr, "Latency[%d]: %.3fms\n", i, diff[i]);
          fprintf(stderr, "******************** total_latency:%.3f, i=%d\n",
                  total_latency, i);

          i++;
        }
      fprintf(stderr, "^^^^^^^^^^^^^^^^^^^ total_latency:%.3f\n",
              total_latency);
    }   

  fprintf(stderr, "Done\n");   

}
4

0 に答える 0