Previous Entry Share Next Entry
Время с ntp сервера
itjustme_tech
Microsoft Visual C++ 2005


void PrintNtp() {
    int lResult;
    WSADATA wsaData;
    lResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (lResult != NO_ERROR) {
        //acutPrintf(L"\nWSAStartup failed with error: %d\n",lResult);
        return;
    };

    hostent *pHE = gethostbyname("0.europe.pool.ntp.org");
    if (!pHE || !pHE->h_length) {
        //acutPrintf(L"\ngethostbyname failed with error: %d\n", WSAGetLastError());
        WSACleanup();
        return;
    };

    SOCKET SendSocket = INVALID_SOCKET;
    SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (SendSocket == INVALID_SOCKET) {
        //acutPrintf(L"\nsocket failed with error: %d\n", WSAGetLastError());
        WSACleanup();
        return;
    };

    sockaddr_in RecvAddr;

    RecvAddr.sin_family = AF_INET;
    RecvAddr.sin_port = htons(123); // ntp motherfucker

    // пример подстановки адреса напрямую
    //RecvAddr.sin_addr.s_addr = inet_addr("91.206.8.36");
    RecvAddr.sin_addr.s_addr = *(u_long *) pHE->h_addr_list[0];

    char SendBuf[48];
    memset(SendBuf, 0, sizeof(SendBuf));
    SendBuf[0] = 0x1b; // version? anyway - some magic number

    //USES_CONVERSION;
    //acutPrintf(L"\n%s\n", A2CW(inet_ntoa(RecvAddr.sin_addr)));
    lResult = sendto(SendSocket, SendBuf, sizeof(SendBuf), 0, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr));
    if (lResult != SOCKET_ERROR) {
        timeval lTimeout;
        lTimeout.tv_sec = 15; // does not matter, long enough
        lTimeout.tv_usec = 0;

        fd_set lReadSet;
        lReadSet.fd_count = 1;
        lReadSet.fd_array[0] = SendSocket;

        if (select(0, &lReadSet, NULL, NULL, &lTimeout) == 1) {
            // get the data back
            ULONG buf[124];    // the buffer we get back
            lResult = recv(SendSocket, (char *) &buf, sizeof(buf), 0);
            if (lResult != SOCKET_ERROR) {
                time_t lTimeFromServer = ntohl((time_t)buf[10]) - 2208988800U;    //# get time
                // lTimeFromServer is now near time(NULL)
                acutPrintf(L"\nNTP Time: %s %i\n", _wctime(&lTimeFromServer), time(NULL));
            //} else {
                //acutPrintf(L"\nrecv failed with error: %d\n", WSAGetLastError());
            };
        };
    //} else {
        //acutPrintf(L"\nsendto failed with error: %d\n", WSAGetLastError());
    };

    closesocket(SendSocket);
    WSACleanup();
};


сообщения об ошибках закомментированы, мне не нужны.
иногда подзависает на выставленные 15 секунд и ничего не возвращает, но в моём случае не принципиально.
gethostbyname возвращает список, но я беру первый. он, как положено, разный.
полученное lTimeFromServer - по смыслу тоже самое, что time(NULL).

?

Log in

No account? Create an account