336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

[NTP] CNtpTime, sntp.h, sntp.cpp 의 문제점 정리

 

NTP 프로토콜을 이용하여 클라이언트 시간 동기화시

 

sntp.h, sntp.cpp 로 만들어진

 

CNtpTime 클래스를 많이 사용하는것 같다.

 

ex)

 

https://github.com/hsluoyz/rmtsvc/blob/master/net4cpp21/protocol/sntpclnt.cpp

 

hsluoyz/rmtsvc

A web-based remote desktop & control service for Windows. - hsluoyz/rmtsvc

github.com

http://read.pudn.com/downloads142/sourcecode/hack/trojan/616424/sntpclient%202008-08-03/NtpTime.c__.htm

 

sntpclient.rar NtpTime.c

www.pudn.com > sntpclient.rar > NtpTime.c, change:2008-08-25,size:4890b #include "NtpTime.h" #include "datatype.h" #include #include #define FALSE 0 SYSTEMTIME st; CNtpTimePacket host2network(CNtpTimePacket ntp) //transform the host byte order to network b

read.pudn.com

https://github.com/domz1/integrity/blob/master/Source/Virtuos_v17/Build/Program/_Network/Misc/Src/Sntp.cpp

 

domz1/integrity

Contribute to domz1/integrity development by creating an account on GitHub.

github.com

 

위 코드들 모두 누군가 만든 CNtpTime 을 그대로 사용하고있는데...

 

그런데 이 클래스에 문제점이 있다.

 

 

 

CNtpTime::operator SYSTEMTIME() 

 

CNtpTime 을 SystemTime 으로 형변환 해주는 오퍼레이터 함수인데

 

 

  st.wMilliseconds = NtpFractionToMs(Fraction());

 

이 부분에 문제가 있다.

 

Fraction 을 Milliseconds 로 변경한 결과가 1000 이 되는 경우가 발생한다.

 

NtpTime 실제 값을 저장 할 시에

 

FileTime 을 사용하는데

 

FileTime 은

 

Second 와 NanoSecond 를 구분하여 16진수 기준 앞 8자리 뒤 8자리로 표현한다.

 

NanoSecond 의 값이 0x100000000 이 1Second 인데

 

NanoSecond 의 표현부는 0xFFFFFFF 이므로 1Second 도 0xFFFFFFF 로 표기된다.

 

 

 

CNtpTime::operator SYSTEMTIME() const
{
// Currently this function only operates correctly in
// the 1900- 2036 primary epoch defined by NTP
SYSTEMTIME st;
DWORD s = Seconds();
st.wSecond = (WORD)( s % 60 );
s /= 60;
st.wMinute = (WORD)( s % 60 );
s /= 60;
st.wHour = (WORD)( s % 24 );
s /= 24;
long JD = s + JAN_1ST_1900;
st.wDayOfWeek = (WORD)( ( JD + 1 ) % 7 );
GetGregorianDate( JD, st.wYear, st.wMonth, st.wDay );
st.wMilliseconds = NtpFractionToMs( Fraction() );
 
return st;
}

 

위 구조 상

 

NtpFractionToMs( Fraction() ) 의 결과값이 1000 이어도

 

Second 로의 올림이 발생하지 않아서

 

Milliseconds 가 1000 인 채로 다음 연산으로 넘어가게 된다.

 

 

Milliseconds 가 1000 인 상태에서

 

SystemTime 을 FileTime 으로 바꾸는 SystemTimeToFileTime 함수를 실행하게 되면

 

비정상값이 리턴된다.