fix for ping measurement under Windows
This commit is contained in:
parent
c717fc11a9
commit
4d980a8a54
7 changed files with 45 additions and 81 deletions
|
@ -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 )
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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 ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
40
src/util.h
40
src/util.h
|
@ -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] )
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue