/* ======================================================================================= 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 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ /* ======================================================================================= 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; }