298 lines
8.3 KiB
C++
298 lines
8.3 KiB
C++
/*
|
|
=======================================================================================
|
|
Name :TimeFunc.cpp
|
|
|
|
Author :vincent lhullier Date :26/07/97
|
|
|
|
Description :time functions
|
|
=======================================================================================
|
|
Modification -> Author : Date :
|
|
Description :
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
#include "stdafx.h"
|
|
|
|
#include "TimeFunc.h"
|
|
#include "IniData.h"
|
|
|
|
#include <winsock.h>
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
Globals
|
|
=======================================================================================
|
|
*/
|
|
|
|
time_t g_xServerTime;
|
|
time_t g_xUpdateTime;
|
|
char g_szUpdateTimeString[20];
|
|
COleDateTime g_oOleUpdatingTime;
|
|
|
|
/*
|
|
=======================================================================================
|
|
Functions to read an int or a date in a buffer
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
---------------------------------------------------------------------------------------
|
|
read an int in char buffer
|
|
---------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL fn_bReadInt( char *p_cBuf, int iNumDigit, int *p_iResult)
|
|
{
|
|
int iNum;
|
|
|
|
*p_iResult = 0;
|
|
for (iNum = 0; iNum < iNumDigit; iNum++)
|
|
{
|
|
if (!isdigit( *p_cBuf ))
|
|
return FALSE;
|
|
*p_iResult = *p_iResult * 10 + (*p_cBuf++ - '0');
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
---------------------------------------------------------------------------------------
|
|
read a date int in char buffer
|
|
---------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL fn_bReadDate( char *p_cBuf, struct tm *p_stTime)
|
|
{
|
|
memset( p_stTime, 0, sizeof( struct tm) );
|
|
if ( (fn_bReadInt( p_cBuf, 2, &p_stTime->tm_mday )) && (*(p_cBuf+=2) == '/') )
|
|
{
|
|
if (( fn_bReadInt( ++p_cBuf, 2, &p_stTime->tm_mon)) && (*(p_cBuf+=2) == '/') )
|
|
{
|
|
if (( fn_bReadInt( ++p_cBuf, 4, &p_stTime->tm_year)) && (*(p_cBuf+=4) == ' ') )
|
|
{
|
|
p_stTime->tm_year -= 1900;
|
|
if (( fn_bReadInt( ++p_cBuf, 2, &p_stTime->tm_hour)) && (*(p_cBuf+=2) == ':') )
|
|
{
|
|
if ( fn_bReadInt( ++p_cBuf, 2, &p_stTime->tm_min) )
|
|
{
|
|
p_stTime->tm_sec = 0;
|
|
p_stTime->tm_isdst = 1;
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
Time functions
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
---------------------------------------------------------------------------------------
|
|
synchronyze with time serveur
|
|
---------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL fn_bSynchronizeTime( BOOL _bMessage )
|
|
{
|
|
if (!fn_bRequestTimeServer( _bMessage ) )
|
|
return FALSE;
|
|
|
|
SYSTEMTIME stSysTime;
|
|
struct tm *p_stTime;
|
|
|
|
_tzset();
|
|
|
|
p_stTime = gmtime( &g_xServerTime );
|
|
//p_stTime = localtime( &g_xServerTime );
|
|
stSysTime.wYear = p_stTime->tm_year + 1900;
|
|
stSysTime.wMonth = p_stTime->tm_mon + 1;
|
|
stSysTime.wDay = p_stTime->tm_mday;
|
|
stSysTime.wHour = p_stTime->tm_hour;
|
|
stSysTime.wMinute = p_stTime->tm_min;
|
|
stSysTime.wSecond = p_stTime->tm_sec;
|
|
|
|
if ( !SetSystemTime( &stSysTime ) )
|
|
return FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
---------------------------------------------------------------------------------------
|
|
updating variable for updating time
|
|
---------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_vInitUpdateTime( void )
|
|
{
|
|
time (&g_xUpdateTime );
|
|
fn_vFormatDateTime( g_xUpdateTime, g_szUpdateTimeString );
|
|
}
|
|
|
|
/*
|
|
---------------------------------------------------------------------------------------
|
|
format time in a string (if time is 0 get current time )
|
|
---------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_vFormatDateTime( time_t xTime, char *szString )
|
|
{
|
|
struct tm *p_stTime;
|
|
|
|
if (xTime == 0)
|
|
time ( &xTime );
|
|
|
|
p_stTime = localtime( &xTime );
|
|
sprintf
|
|
(
|
|
szString,
|
|
"%02d/%02d/%04d %02d:%02d",
|
|
p_stTime->tm_mday,
|
|
p_stTime->tm_mon + 1,
|
|
p_stTime->tm_year + 1900,
|
|
p_stTime->tm_hour,
|
|
p_stTime->tm_min
|
|
);
|
|
}
|
|
|
|
|
|
/*
|
|
---------------------------------------------------------------------------------------
|
|
Ask server time
|
|
---------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL fn_bRequestTimeServer( BOOL _bMessage )
|
|
{
|
|
int iSocketDescriptor; // socket descriptor
|
|
struct sockaddr_in stDestAddr; // destination address
|
|
int iAddrLength; // address length
|
|
char a_cBuffer[200];
|
|
char *p_cBuffer;
|
|
int iOption; /* option for setsockopt() */
|
|
int iErrNo;
|
|
fd_set stFDSet;
|
|
struct timeval stTimeout;
|
|
unsigned short uwDestPort;
|
|
|
|
|
|
// open socket
|
|
iSocketDescriptor=socket(PF_INET, SOCK_DGRAM, 0);
|
|
if(iSocketDescriptor<0)
|
|
{
|
|
p_cBuffer = a_cBuffer + sprintf( a_cBuffer, "Error with time server (socket error)\r\n" );
|
|
iErrNo = WSAGetLastError();
|
|
switch (iErrNo)
|
|
{
|
|
case WSANOTINITIALISED:
|
|
strcpy( a_cBuffer, "Window socket not initialized");
|
|
break;
|
|
case WSAENETDOWN:
|
|
strcpy( a_cBuffer, "Network subsystem has failed" );
|
|
break;
|
|
case WSAEAFNOSUPPORT:
|
|
strcpy( a_cBuffer, "The specified address family is not supported" );
|
|
break;
|
|
case WSAEINPROGRESS :
|
|
strcpy( a_cBuffer, "There's a blocking socket" );
|
|
break;
|
|
case WSAEMFILE:
|
|
strcpy( a_cBuffer, "No more socket descriptors are available." );
|
|
break;
|
|
case WSAENOBUFS:
|
|
strcpy( a_cBuffer, "No buffer space is available. The socket cannot be created." );
|
|
break;
|
|
case WSAEPROTONOSUPPORT:
|
|
strcpy( a_cBuffer, "The specified protocol is not supported." );
|
|
break;
|
|
case WSAEPROTOTYPE :
|
|
strcpy( a_cBuffer, "The specified protocol is the wrong type for this socket." );
|
|
break;
|
|
case WSAESOCKTNOSUPPORT:
|
|
strcpy( a_cBuffer, "The specified socket type is not supported in this address family." );
|
|
break;
|
|
default :
|
|
sprintf( a_cBuffer, "Erreur (%d) : %s", iErrNo, strerror( iErrNo ) );
|
|
}
|
|
if (_bMessage)
|
|
AfxMessageBox( a_cBuffer, MB_ICONSTOP );
|
|
return FALSE;
|
|
}
|
|
|
|
// set socket option
|
|
iOption = ~0;
|
|
if( setsockopt(iSocketDescriptor, SOL_SOCKET, SO_BROADCAST, (char *) &iOption, sizeof(iOption)) < 0)
|
|
{
|
|
iErrNo = WSAGetLastError();
|
|
sprintf( a_cBuffer, "Erreur (%d) : %s", iErrNo, strerror( iErrNo ) );
|
|
if (_bMessage)
|
|
AfxMessageBox( a_cBuffer, MB_ICONSTOP );
|
|
return FALSE;
|
|
}
|
|
|
|
uwDestPort = 1515;
|
|
iAddrLength = sizeof( struct sockaddr_in );
|
|
|
|
// Give the destination socket a name.
|
|
stDestAddr.sin_family = AF_INET;
|
|
stDestAddr.sin_port = htons ( uwDestPort );
|
|
stDestAddr.sin_addr.s_addr = INADDR_BROADCAST;
|
|
|
|
// send request
|
|
sprintf(a_cBuffer, "time_v2");
|
|
if( sendto(iSocketDescriptor, a_cBuffer, strlen(a_cBuffer) + 1, 0, (struct sockaddr *) &stDestAddr, sizeof ( struct sockaddr_in ))<0)
|
|
{
|
|
iErrNo = WSAGetLastError();
|
|
sprintf( a_cBuffer, "Erreur (%d) : %s", iErrNo, strerror( iErrNo ) );
|
|
if (_bMessage)
|
|
AfxMessageBox( a_cBuffer, MB_ICONSTOP );
|
|
return FALSE;
|
|
}
|
|
|
|
iAddrLength = sizeof(struct sockaddr_in);
|
|
|
|
// get server response
|
|
FD_ZERO( &stFDSet );
|
|
FD_SET( iSocketDescriptor, &stFDSet);
|
|
stTimeout.tv_sec=5;
|
|
stTimeout.tv_usec=0;
|
|
|
|
if (select(0, &stFDSet, NULL, NULL, &stTimeout) == 0)
|
|
{
|
|
iErrNo = WSAGetLastError();
|
|
sprintf( a_cBuffer, "Erreur (%d) : %s", iErrNo, strerror( iErrNo ) );
|
|
if (_bMessage)
|
|
AfxMessageBox( a_cBuffer, MB_ICONSTOP );
|
|
return FALSE;
|
|
}
|
|
|
|
if ( !FD_ISSET( iSocketDescriptor, &stFDSet ) )
|
|
{
|
|
iErrNo = WSAGetLastError();
|
|
sprintf( a_cBuffer, "Erreur (%d) : %s", iErrNo, strerror( iErrNo ) );
|
|
if (_bMessage)
|
|
AfxMessageBox( a_cBuffer, MB_ICONSTOP );
|
|
return FALSE;
|
|
}
|
|
|
|
if( recvfrom(iSocketDescriptor, a_cBuffer, sizeof(a_cBuffer), 0, (struct sockaddr *) &stDestAddr, &iAddrLength) < 0)
|
|
{
|
|
iErrNo = WSAGetLastError();
|
|
sprintf( a_cBuffer, "Erreur (%d) : %s", iErrNo, strerror( iErrNo ) );
|
|
if (_bMessage)
|
|
AfxMessageBox( a_cBuffer, MB_ICONSTOP );
|
|
return FALSE;
|
|
}
|
|
memcpy( &g_xServerTime, a_cBuffer, sizeof( time_t ) );
|
|
|
|
|
|
// close socket
|
|
closesocket(iSocketDescriptor);
|
|
return TRUE;
|
|
}
|
|
|