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
반응형
'소소한 C# 지식' 카테고리의 다른 글
[C#] C# 주석 사용 방법 및 종류 (9) | 2022.04.22 |
---|---|
[C#]C#으로 Window Service(윈도우 서비스) 만들기 (10) | 2022.04.21 |
[C#/WINFORM]-Datagridview Excel Import(엑셀 불러오기) (2) | 2022.04.20 |
[c#/WINFORM] - Datagridview Excel Export (엑셀 내보내기) (0) | 2022.04.18 |
[C#]데이터 포맷(Data Format) 형식 변경 - 숫자, 일자, 시간 (0) | 2022.04.14 |
댓글