[NTP] CNtpTime, sntp.h, sntp.cpp 의 문제점 정리
NTP 프로토콜을 이용하여 클라이언트 시간 동기화시
sntp.h, sntp.cpp 로 만들어진
CNtpTime 클래스를 많이 사용하는것 같다.
ex)
https://github.com/hsluoyz/rmtsvc/blob/master/net4cpp21/protocol/sntpclnt.cpp
위 코드들 모두 누군가 만든 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 함수를 실행하게 되면
비정상값이 리턴된다.
'Programming > C,CPP,CS' 카테고리의 다른 글
RegisterClientScriptBlock (0) | 2020.07.21 |
---|---|
[C#] CS0246 형식 또는 네임스페이스 이름을 찾을 수 없습니다. using 지시문 또는 어셈블리 참조가 있는지 확인하세요. (0) | 2020.07.20 |
[CPP] NTP Sync LocalClockOffset (0) | 2019.12.23 |
ActiveX 웹배포 (0) | 2019.12.10 |
ffmpeg sample (0) | 2018.06.20 |