본문 바로가기
IT/Software

NTP - 간단하게 타임스탬프 가져오기

머 그냥 UDP로 보내서 타임스탬프 값 가져와서 쓰면 되는디

받은 값이 먼지 모르게 요상타.

 

일단 NTP 패킷의 구조는 다음 사이트에 가면 아주 자세하게 볼 수 있다.

http://www.networksorcery.com/enp/protocol/sntp.htm#Receive%20Timestamp

 

SNTP, Simple Network Time Protocol

WWVFt. Collins (US) Radio 2.5, 5, 10, 15, 20 MHz.

www.networksorcery.com

중요한 것은 아래 그림에서 Transmit Timestamp 값이다.

NTP Packet 구조

자세히 공부 하는 것도 좋지만, 여튼 이 패킷을 받으면

41번째 바이트 부터 4바이트만 읽는다.

그 4바이트 값이 바로 1900년에서 지금 현재 까지의 시간 값을 저장하고 있다.

물론 초단위의 값이다.

1900년 1월 1일 0시 0분 1초라면 이 값은 0x00000001 일 것이다.

 

암튼 엄청난 큰 값이지만 초단위의 시간이고 역산해서 1900년 기준으로 더하고 빼고 하면 현재 시간을 획득할 수 있다.

 

유닉스 타임스탬프??

어떤 시스템에서는 기준을 1970년을 기준으로 하는 것도 있다. 유닉스 타임스탬프?  몰라.. 대충 그런거다

 

막상 내가 알고 있는 값과 다르게 이상하게 값이 크다면 싶은데 그것은 아래 코드를 보고 변경해서 사용하시길

실제 받아보면 Unix timestamp 값이 이상해 보일 수 있다. 이상하게 값이 크다고 싶은데 그것은 아래 코드를 보면 비밀이 풀린다.

```c
/* Time Base Conversion Macros
 *
 * The NTP timebase is 00:00 Jan 1 1900.  The local
 * time base is 00:00 Jan 1 1970.  Convert between
 * these two by added or substracting 70 years
 * worth of time.  Note that 17 of these years were
 * leap years.
 */
#define TIME_BASEDIFF           ((((uint64_t)70*365 + 17) * 24*3600))
#define TIME_NTP_TO_LOCAL(t)	((t)-TIME_BASEDIFF)
#define TIME_LOCAL_TO_NTP(t)	((t)+TIME_BASEDIFF)
```

1900 이 기준이나 1970년이 기준이냐에 따라 값이 다르다는 것...머 잘 빼고 더하면 된다.

아래 사이트에 들어가 보면 현재 지금의 timestamp값을 바로 볼 수 있다. 

구현후에 비교해 보시길...

https://www.epochconverter.com/