0

RakNet を使用してプログラムをネットワーク化しており、実行時にネットワーク統計を取得したいと考えています。幸いなことに、RakNet にはこのための組み込み関数が 2 つあります。GetStatistics()およびStatisticsToString()。ただし、StatisticsToString()関数を呼び出すとプログラムがクラッシュし (StatisticsToString は、sprintf 関数を使用して統計データを文字列に変換することになっているだけです)、その理由がまったくわかりません...エラーはありません...何もありません。関数のソース コードを変更し、関数を に置き換えたところsprintf()std::coutプログラムは意図したとおりに正常に動作しました。

統計を書き込むための私のカスタム関数:

void HavNetProfiler::WriteStats(RakNet::RakPeerInterface *peer)
{

  if (RakNet::GetTimeMS() > nextStatTime)
  {
    nextStatTime = RakNet::GetTimeMS() + 1000;
    RakNet::RakNetStatistics rns;
    char *text;

    peer->GetStatistics(peer->GetSystemAddressFromIndex(0), &rns);
    RakNet::StatisticsToString(&rns, text, 0);
    //printf("%s\n\n", text);
  }

StatisticsToString() 関数のソース コードのスニペット:

void RAK_DLL_EXPORT RakNet::StatisticsToString( RakNetStatistics *s, char *buffer, int verbosityLevel )
{
    if ( s == 0 )
    {
        sprintf( buffer, "stats is a NULL pointer in statsToString\n" );
        return ;
    }

    if (verbosityLevel==0)
    {
        sprintf(buffer,
            "Bytes per second sent     %" PRINTF_64_BIT_MODIFIER "u\n"
            "Bytes per second received %" PRINTF_64_BIT_MODIFIER "u\n"
            "Current packetloss        %.1f%%\n",
            (long long unsigned int) s->valueOverLastSecond[ACTUAL_BYTES_SENT],
            (long long unsigned int) s->valueOverLastSecond[ACTUAL_BYTES_RECEIVED],
            s->packetlossLastSecond*100.0f
            );

      //Modified std::cout solution
      /*std::cout << "\nB/s sent: " << (long long unsigned int) s->valueOverLastSecond[ACTUAL_BYTES_SENT] 
        << "\nB/s recieved: " << (long long unsigned int) s->valueOverLastSecond[ACTUAL_BYTES_RECEIVED]
        << "\nCurrent packetloss: " << s->packetlossLastSecond*100.0f << "\n"
        << std::flush;*/
    }

std::coutRakNet のソース コードを編集する必要がないように、この解決策は一時的なものです。sprintf が意図したとおりに動作しない理由を理解するために、あなたの助けが必要です。私はC++にかなり慣れていないので、ここで本当に明白な何かが欠けているかもしれません. 知らない...

ありがとう!

4

1 に答える 1