C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[75195] Re: Network Time Protocol (NTP) 이야 뻔한거 아닙니까.
빌더(TWx) [builder] 3238 읽음    2018-12-06 00:32
ㅇㅇ 님이 쓰신 글 :
: 소스를 찾아보니 MFC로 하는 것 밖에 없더라구요. 윈도우 함수로 타임서버와 시간 동기화를 할 수 있는 방법이 있나요? 아니면 어쩔 수 없이 MFC dll 만들어야 하나요?



답변:


NTP 프로토콜이야 뻔한거 아닙니까.

에러체크, Non-blocking 사용하지 않고 간단하게 다음과 같이
NTP 패킷 전송을 udp 로 구현할 수 있지요.

#include 
#include 
#include 
#include 

#pragma comment(lib, "ws2_32.lib")

#define SWAP(x) ((x) = \
    ((x)&0xff000000) >> 24 |       \
    ((x)&0x00ff0000) >> 8  |       \
    ((x)&0x0000ff00) << 8  |       \
    ((x)&0x000000ff) << 24)

int main()
{
    WSADATA wsaData;
    ::WSAStartup(MAKEWORD(2, 0), &wsaData);

    // NTP packet
    unsigned char packet[48] { 0x1b };

    SOCKET sock = ::socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    sockaddr_in srv_addr {};

    struct addrinfo *addrTmp = nullptr;

    getaddrinfo("kr.pool.ntp.org", "ntp", NULL, &addrTmp);

    for (struct addrinfo *p = addrTmp; p; p = p->ai_next)
    {
        if (p->ai_family == AF_INET) {
            memcpy(&srv_addr, p->ai_addr, sizeof(srv_addr));
            break;
        }
    }
    freeaddrinfo(addrTmp);

    // send NTP query packet
    ::sendto(sock, (const char*)packet, sizeof(packet), 0, (sockaddr*)&srv_addr, sizeof(srv_addr));
    // receive NTP response
    ::recv(sock, (char*)packet, sizeof(packet), 0);

    PDWORD pd = ((PDWORD)&packet + 10);
    // swap machine endian
    SWAP(*pd);

    // base 1970
    time_t t = ((time_t)*((PDWORD)&packet + 10)) - 2208988800ULL;

    char buf[1024];
    // convert NTP time_t to struct tm local system time-zone
    strftime(buf, 1023, "[%Y-%m-%d %p %H:%M:%S]", localtime(&t));
    printf("network time server query: %s\n", buf);
    WSACleanup();
    return 0;
}



+ -

관련 글 리스트
75194 타임 서버와 프로그램을 동기화 하려고 하는데요 ㅇㅇ 3091 2018/12/05
75195     Re: Network Time Protocol (NTP) 이야 뻔한거 아닙니까. 빌더(TWx) 3238 2018/12/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.