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