본문 바로가기
소소한 C# 지식

[C#]NTP 서버 - PC 시스템 시간 동기화 프로그램

by 해뤼맘 2022. 4. 20.
728x90
반응형

안녕하세요

C# 프로그램 구동 시 NTP 서버로부터 시간을 받아와

로컬 PC 시스템 시간 동기화 하는 코드를 포스팅하겠습니다.

 

* NTP 서버란?

- Network Time Protocol의 약자로

Network에 연결된 컴퓨터 간의 시간 동기화를 위하여 사용되는 프로토콜을 말합니다.

 

1. NTP 서버 - PC 시간 동기화 코드

        public static void TimeCheck()
        {
        	//동기화 하는 동안 현재 스레드를 일시 중단
            Thread.Sleep(2000);

          try
           {

                var ntpData = new byte[48];
                ntpData[0] = 0x1B;
                
                //Dns.GetHostEntry : 호스트명에 대한 IP 정보, Alias 정보 등을 리턴하는데,
                //이렇게 리턴되는 정보를 IPHostEntry 객체에 담게된다.
                var addresses = Dns.GetHostEntry("NTP 서버 주소").AddressList;
                var ipEndPoint = new IPEndPoint(addresses[0], 123);
           
                using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
                {
                    socket.Connect(ipEndPoint);
                    socket.ReceiveTimeout = 5;

                    socket.Send(ntpData);
                    socket.Receive(ntpData);
                    socket.Close();
                }

                const byte serverReplyTime = 40;
                ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime);
                ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4);


                intPart = SwapEndianness(intPart);
                fractPart = SwapEndianness(fractPart);


                var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);
                var networkDateTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds((long)milliseconds);
				
                //현재 Datetime 개체의 값을 현지시간으로 변환
                m_ServerTime = networkDateTime.ToLocalTime();
                OnTimeUpdated?.Invoke(m_ServerTime);

                //pc에 적용하기
                SYSTEMTIME st = new SYSTEMTIME();
                st.wYear = (short)m_ServerTime.Year;
                st.wMonth = (short)m_ServerTime.Month;
                st.wDay = (short)m_ServerTime.Day;
                st.wHour = (short)m_ServerTime.Hour;
                st.wMinute = (short)m_ServerTime.Minute;
                st.wSecond = (short)m_ServerTime.Second;
                st.wMilliseconds = (short)m_ServerTime.Millisecond;

                bool result = SetLocalTime(ref st);
                if (result == false)
                {
                    int lastError = Marshal.GetLastWin32Error();
                    Console.WriteLine(lastError);
                }


            }
            catch (Exception e)
                    {
                      
                    }


         
        }

이상 C# NTP 서버와 PC 시간 간의 동기화 내용이었습니다.

728x90
반응형

댓글