/*--------------------------------------------------- called when the window received WSOCK_SELECT. receive SNTP data and set time. ---------------------------------------------------*/ void OnReceive(HWND hwnd, WPARAM wParam, LPARAM lParam) { struct sockaddr_in serversockaddr; struct NTP_Packet NTP_Recv; int sockaddr_Size; if(g_socket == -1) return; if(WSAGETSELECTERROR(lParam)) { SocketClose(hwnd, "failed to receive"); return; } if(g_socket != (int)wParam || WSAGETSELECTEVENT(lParam) != FD_READ) return; // receive data sockaddr_Size = sizeof(serversockaddr); if(recvfrom(g_socket, (char *)&NTP_Recv, sizeof(NTP_Recv), 0, (struct sockaddr *)&serversockaddr, &sockaddr_Size) == SOCKET_ERROR) { SocketClose(hwnd, "recvfrom() failed"); return; } // if Leap Indicator is 3 /* if(ntohl(NTP_Recv.Control_Word) >> 30 == 3) { SocketClose(hwnd, "server is unhealthy"); return; } */ // set system time SynchronizeSystemTime(ntohl(NTP_Recv.transmit_timestamp_seconds), ntohl(NTP_Recv.transmit_timestamp_fractions)); // close socket SocketClose(hwnd, NULL); }
/*--------------------------------------------------- called when the window received WSOCK_SELECT. receive SNTP data and set time. ---------------------------------------------------*/ void OnReceive(HWND hwndSNTP, WPARAM wParam, LPARAM lParam) { struct sockaddr_in serversockaddr; struct NTP_Packet NTP_Recv; int sockaddr_Size; if(m_socket == INVALID_SOCKET) return; if(WSAGETSELECTERROR(lParam)) { SocketClose(hwndSNTP, "failed to receive"); return; } if(m_socket != (SOCKET)wParam || WSAGETSELECTEVENT(lParam) != FD_READ) return; // receive data m_dwTickCountOnRecv = timeGetTime(); sockaddr_Size = sizeof(serversockaddr); if(recvfrom(m_socket, (char *)&NTP_Recv, sizeof(NTP_Recv), 0, (struct sockaddr *)&serversockaddr, &sockaddr_Size) == SOCKET_ERROR) { SocketClose(hwndSNTP, "recvfrom() failed"); return; } // if Leap Indicator is 3 if((NTP_Recv.Control_Byte >> 6) == 3) { SocketClose(hwndSNTP, "server is unhealthy"); return; } // set system time SynchronizeSystemTime(hwndSNTP, &NTP_Recv); // close socket SocketClose(hwndSNTP, NULL); }