fix for ping measurement under Windows

This commit is contained in:
Volker Fischer 2008-08-10 21:56:03 +00:00
parent c717fc11a9
commit 4d980a8a54
7 changed files with 45 additions and 81 deletions

View file

@ -80,12 +80,12 @@ CChannelSet::CChannelSet() : bWriteStatusHTMLFile ( false )
QObject::connect ( &vecChannels[5], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh5 ( QString ) ) ); QObject::connect ( &vecChannels[5], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh5 ( QString ) ) );
// ping message received // ping message received
QObject::connect ( &vecChannels[0], SIGNAL ( PingReceived ( QTime ) ), this, SLOT ( OnPingReceivedCh0 ( QTime ) ) ); QObject::connect ( &vecChannels[0], SIGNAL ( PingReceived ( int ) ), this, SLOT ( OnPingReceivedCh0 ( int ) ) );
QObject::connect ( &vecChannels[1], SIGNAL ( PingReceived ( QTime ) ), this, SLOT ( OnPingReceivedCh1 ( QTime ) ) ); QObject::connect ( &vecChannels[1], SIGNAL ( PingReceived ( int ) ), this, SLOT ( OnPingReceivedCh1 ( int ) ) );
QObject::connect ( &vecChannels[2], SIGNAL ( PingReceived ( QTime ) ), this, SLOT ( OnPingReceivedCh2 ( QTime ) ) ); QObject::connect ( &vecChannels[2], SIGNAL ( PingReceived ( int ) ), this, SLOT ( OnPingReceivedCh2 ( int ) ) );
QObject::connect ( &vecChannels[3], SIGNAL ( PingReceived ( QTime ) ), this, SLOT ( OnPingReceivedCh3 ( QTime ) ) ); QObject::connect ( &vecChannels[3], SIGNAL ( PingReceived ( int ) ), this, SLOT ( OnPingReceivedCh3 ( int ) ) );
QObject::connect ( &vecChannels[4], SIGNAL ( PingReceived ( QTime ) ), this, SLOT ( OnPingReceivedCh4 ( QTime ) ) ); QObject::connect ( &vecChannels[4], SIGNAL ( PingReceived ( int ) ), this, SLOT ( OnPingReceivedCh4 ( int ) ) );
QObject::connect ( &vecChannels[5], SIGNAL ( PingReceived ( QTime ) ), this, SLOT ( OnPingReceivedCh5 ( QTime ) ) ); QObject::connect ( &vecChannels[5], SIGNAL ( PingReceived ( int ) ), this, SLOT ( OnPingReceivedCh5 ( int ) ) );
} }
CVector<CChannelShortInfo> CChannelSet::CreateChannelList() CVector<CChannelShortInfo> CChannelSet::CreateChannelList()
@ -605,8 +605,8 @@ CChannel::CChannel() : sName ( "" ),
QObject::connect( &Protocol, SIGNAL ( ChatTextReceived ( QString ) ), QObject::connect( &Protocol, SIGNAL ( ChatTextReceived ( QString ) ),
this, SIGNAL ( ChatTextReceived ( QString ) ) ); this, SIGNAL ( ChatTextReceived ( QString ) ) );
QObject::connect( &Protocol, SIGNAL ( PingReceived ( QTime ) ), QObject::connect( &Protocol, SIGNAL ( PingReceived ( int ) ),
this, SIGNAL ( PingReceived ( QTime ) ) ); this, SIGNAL ( PingReceived ( int ) ) );
} }
void CChannel::SetEnable ( const bool bNEnStat ) void CChannel::SetEnable ( const bool bNEnStat )

View file

@ -123,7 +123,7 @@ public:
void CreateReqJitBufMes() { Protocol.CreateReqJitBufMes(); } void CreateReqJitBufMes() { Protocol.CreateReqJitBufMes(); }
void CreateReqConnClientsList() { Protocol.CreateReqConnClientsList(); } void CreateReqConnClientsList() { Protocol.CreateReqConnClientsList(); }
void CreateChatTextMes ( const QString& strChatText ) { Protocol.CreateChatTextMes ( strChatText ); } void CreateChatTextMes ( const QString& strChatText ) { Protocol.CreateChatTextMes ( strChatText ); }
void CreatePingMes ( const QTime time ) { Protocol.CreatePingMes ( time ); } void CreatePingMes ( const int iMs ) { Protocol.CreatePingMes ( iMs ); }
void CreateNetwBlSiFactMes ( const int iNetwBlSiFact ) void CreateNetwBlSiFactMes ( const int iNetwBlSiFact )
{ {
@ -203,7 +203,7 @@ signals:
void ProtocolStatus ( bool bOk ); void ProtocolStatus ( bool bOk );
void NameHasChanged(); void NameHasChanged();
void ChatTextReceived ( QString strChatText ); void ChatTextReceived ( QString strChatText );
void PingReceived ( QTime time ); void PingReceived ( int iMs );
}; };
@ -304,12 +304,12 @@ public slots:
void OnChatTextReceivedCh4 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 4, strChatText ); } void OnChatTextReceivedCh4 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 4, strChatText ); }
void OnChatTextReceivedCh5 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 5, strChatText ); } void OnChatTextReceivedCh5 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 5, strChatText ); }
void OnPingReceivedCh0 ( QTime time ) { vecChannels[0].CreatePingMes ( time ); } void OnPingReceivedCh0 ( int iMs ) { vecChannels[0].CreatePingMes ( iMs ); }
void OnPingReceivedCh1 ( QTime time ) { vecChannels[1].CreatePingMes ( time ); } void OnPingReceivedCh1 ( int iMs ) { vecChannels[1].CreatePingMes ( iMs ); }
void OnPingReceivedCh2 ( QTime time ) { vecChannels[2].CreatePingMes ( time ); } void OnPingReceivedCh2 ( int iMs ) { vecChannels[2].CreatePingMes ( iMs ); }
void OnPingReceivedCh3 ( QTime time ) { vecChannels[3].CreatePingMes ( time ); } void OnPingReceivedCh3 ( int iMs ) { vecChannels[3].CreatePingMes ( iMs ); }
void OnPingReceivedCh4 ( QTime time ) { vecChannels[4].CreatePingMes ( time ); } void OnPingReceivedCh4 ( int iMs ) { vecChannels[4].CreatePingMes ( iMs ); }
void OnPingReceivedCh5 ( QTime time ) { vecChannels[5].CreatePingMes ( time ); } void OnPingReceivedCh5 ( int iMs ) { vecChannels[5].CreatePingMes ( iMs ); }
signals: signals:
void MessReadyForSending ( int iChID, CVector<uint8_t> vecMessage ); void MessReadyForSending ( int iChID, CVector<uint8_t> vecMessage );

View file

@ -55,8 +55,8 @@ CClient::CClient() : bRun ( false ), Socket ( &Channel ),
QObject::connect ( &Channel, SIGNAL ( ChatTextReceived ( QString ) ), QObject::connect ( &Channel, SIGNAL ( ChatTextReceived ( QString ) ),
this, SIGNAL ( ChatTextReceived ( QString ) ) ); this, SIGNAL ( ChatTextReceived ( QString ) ) );
QObject::connect ( &Channel, SIGNAL ( PingReceived ( QTime ) ), QObject::connect ( &Channel, SIGNAL ( PingReceived ( int ) ),
this, SLOT ( OnReceivePingMessage ( QTime ) ) ); this, SLOT ( OnReceivePingMessage ( int ) ) );
} }
void CClient::OnSendProtMessage ( CVector<uint8_t> vecMessage ) void CClient::OnSendProtMessage ( CVector<uint8_t> vecMessage )
@ -97,10 +97,10 @@ void CClient::OnNewConnection()
Channel.CreateReqConnClientsList(); Channel.CreateReqConnClientsList();
} }
void CClient::OnReceivePingMessage ( QTime time ) void CClient::OnReceivePingMessage ( int iMs )
{ {
// calculate difference between received time and current time // calculate difference between received time in ms and current time in ms
emit PingTimeReceived ( time.msecsTo ( QTime().currentTime() ) /* ms */ ); emit PingTimeReceived ( CPreciseTime().elapsed() - iMs );
} }
bool CClient::SetServerAddr ( QString strNAddr ) bool CClient::SetServerAddr ( QString strNAddr )

View file

@ -127,7 +127,7 @@ public:
{ Channel.CreateChatTextMes ( strChatText ); } { Channel.CreateChatTextMes ( strChatText ); }
void SendPingMess() void SendPingMess()
{ Channel.CreatePingMes ( QTime().currentTime() ); } { Channel.CreatePingMes ( CPreciseTime().elapsed() ); };
CSound* GetSndInterface() { return &Sound; } CSound* GetSndInterface() { return &Sound; }
CChannel* GetChannel() { return &Channel; } CChannel* GetChannel() { return &Channel; }
@ -187,7 +187,7 @@ public slots:
void OnReqJittBufSize(); void OnReqJittBufSize();
void OnProtocolStatus ( bool bOk ); void OnProtocolStatus ( bool bOk );
void OnNewConnection(); void OnNewConnection();
void OnReceivePingMessage ( QTime time ); void OnReceivePingMessage ( int iMs );
signals: signals:
void ConClientListMesReceived ( CVector<CChannelShortInfo> vecChanInfo ); void ConClientListMesReceived ( CVector<CChannelShortInfo> vecChanInfo );

View file

@ -100,9 +100,9 @@ MESSAGES
- Ping message (for measuring the ping time) PROTMESSID_PING - Ping message (for measuring the ping time) PROTMESSID_PING
+--------------------------------------------------------------------------+ +-----------------------------+
| 5 bytes transmit time (1 byte hours, 1 byte min, 1 byte sec, 2 bytes ms) | | 4 bytes transmit time in ms |
+--------------------------------------------------------------------------+ +-----------------------------+
****************************************************************************** ******************************************************************************
@ -676,40 +676,22 @@ void CProtocol::EvaluateChatTextMes ( unsigned int iPos, const CVector<uint8_t>&
emit ChatTextReceived ( strChatText ); emit ChatTextReceived ( strChatText );
} }
void CProtocol::CreatePingMes ( const QTime time ) void CProtocol::CreatePingMes ( const int iMs )
{ {
unsigned int iPos = 0; // init position pointer unsigned int iPos = 0; // init position pointer
// build data vector (5 bytes long) // build data vector (4 bytes long)
CVector<uint8_t> vecData ( 5 ); CVector<uint8_t> vecData ( 4 );
// convert QTime to network time
CVector<unsigned char> vNetTimeInfo ( CTimeConv().QTi2NetTi ( time ) );
// convert all bytes (byte by byte)
for ( int j = 0; j < 5; j++ )
{
// byte-by-byte copying of the string data // byte-by-byte copying of the string data
PutValOnStream ( vecData, iPos, PutValOnStream ( vecData, iPos, static_cast<uint32_t> ( iMs ), 4 );
static_cast<uint32_t> ( vNetTimeInfo[j] ), 1 );
}
CreateAndSendMessage ( PROTMESSID_PING, vecData ); CreateAndSendMessage ( PROTMESSID_PING, vecData );
} }
void CProtocol::EvaluatePingMes ( unsigned int iPos, const CVector<uint8_t>& vecData ) void CProtocol::EvaluatePingMes ( unsigned int iPos, const CVector<uint8_t>& vecData )
{ {
// time information vector emit PingReceived ( static_cast<int> ( GetValFromStream ( vecData, iPos, 4 ) ) );
CVector<unsigned char> vNetTimeInfo ( 5 ); // 5 bytes
for ( int j = 0; j < 5; j++ )
{
// byte-by-byte copying of the time information data
int iData = static_cast<int> ( GetValFromStream ( vecData, iPos, 1 ) );
vNetTimeInfo[j] = static_cast<unsigned char> ( iData );
}
// convert time to QTime and invoke message action
emit PingReceived ( CTimeConv().NetTi2QTi ( vNetTimeInfo ) );
} }

View file

@ -73,7 +73,7 @@ public:
void CreateChanGainMes ( const int iChanID, const double dGain ); void CreateChanGainMes ( const int iChanID, const double dGain );
void CreateChanNameMes ( const QString strName ); void CreateChanNameMes ( const QString strName );
void CreateChatTextMes ( const QString strChatText ); void CreateChatTextMes ( const QString strChatText );
void CreatePingMes ( const QTime time ); void CreatePingMes ( const int iMs );
void CreateConClientListMes ( const CVector<CChannelShortInfo>& vecChanInfo ); void CreateConClientListMes ( const CVector<CChannelShortInfo>& vecChanInfo );
@ -168,7 +168,7 @@ signals:
void ChangeChanGain ( int iChanID, double dNewGain ); void ChangeChanGain ( int iChanID, double dNewGain );
void ChangeChanName ( QString strName ); void ChangeChanName ( QString strName );
void ChatTextReceived ( QString strChatText ); void ChatTextReceived ( QString strChatText );
void PingReceived ( QTime time ); void PingReceived ( int iMs );
void ConClientListMesReceived ( CVector<CChannelShortInfo> vecChanInfo ); void ConClientListMesReceived ( CVector<CChannelShortInfo> vecChanInfo );
void ReqJittBufSize(); void ReqJittBufSize();
void ReqConnClientsList(); void ReqConnClientsList();

View file

@ -37,6 +37,8 @@
using namespace std; // because of the library: "vector" using namespace std; // because of the library: "vector"
#ifdef _WIN32 #ifdef _WIN32
# include "../windows/moc/aboutdlgbase.h" # include "../windows/moc/aboutdlgbase.h"
# include <windows.h>
# include <mmsystem.h>
#else #else
# include "moc/aboutdlgbase.h" # include "moc/aboutdlgbase.h"
#endif #endif
@ -431,39 +433,19 @@ protected:
}; };
// Time conversion ------------------------------------------------------------- // Precise time ----------------------------------------------------------------
// needed for ping measurement // needed for ping measurement
class CTimeConv class CPreciseTime
{ {
public: public:
// QTime to network time vector // precise time (on Windows the QTime is not precise enough)
static CVector<unsigned char> QTi2NetTi ( const QTime qTiIn ) static int elapsed()
{ {
// vector format: 1 byte hours, 1 byte min, 1 byte sec, 2 bytes ms #ifdef _WIN32
CVector<unsigned char> veccNetTi ( 5 ); return timeGetTime();
#else
veccNetTi[0] = static_cast<unsigned char> ( qTiIn.hour() ); return QTime().elapsed();
veccNetTi[1] = static_cast<unsigned char> ( qTiIn.minute() ); #endif
veccNetTi[2] = static_cast<unsigned char> ( qTiIn.second() );
const int iMs = qTiIn.msec();
veccNetTi[3] = static_cast<unsigned char> ( ( iMs >> 8 ) & 255 );
veccNetTi[4] = static_cast<unsigned char> ( iMs & 255 );
return veccNetTi;
}
// network time vector to QTime
static QTime NetTi2QTi ( const CVector<unsigned char> netTiIn )
{
// vector format: 1 byte hours, 1 byte min, 1 byte sec, 2 bytes ms
return QTime (
static_cast<int> ( netTiIn[0] ), // hour
static_cast<int> ( netTiIn[1] ), // minute
static_cast<int> ( netTiIn[2] ), // seconds
// msec
static_cast<int> ( ( netTiIn[3] << 8 ) | netTiIn[4] )
);
} }
}; };