/*--------------------------------------------------- called when the window received WSOCK_GETHOST. get IP address and send data. ---------------------------------------------------*/ void OnGetHost(HWND hwnd, WPARAM wParam, LPARAM lParam) { struct hostent *pHostEnt; unsigned long serveraddr; if(g_hGetHost == NULL) return; // success ? if(WSAGETASYNCERROR(lParam) != 0) { SocketClose(hwnd, "failed to get IP address"); return; } // valid handle ? if(g_hGetHost != (HANDLE)wParam) return; // get IP address pHostEnt = (struct hostent *)g_pGetHost; serveraddr = *((unsigned long *)((pHostEnt->h_addr_list)[0])); free(g_pGetHost); g_pGetHost = NULL; g_hGetHost = NULL; // send data SNTPSend(hwnd, serveraddr); }
/*--------------------------------------------------- start SNTP session ---------------------------------------------------*/ BOOL SNTPStart(HWND hwndSNTP) { char servername[BUFSIZE_SERVER]; unsigned long serveraddr; if(m_socket != INVALID_SOCKET || m_hGetHost != NULL) return FALSE; // get server name and port m_port = GetServerPort(m_servername, servername); if(m_port == -1) { Log(hwndSNTP, "invalid server name"); return FALSE; } // make a socket m_socket = socket(PF_INET, SOCK_DGRAM, 0); if(m_socket == INVALID_SOCKET) { Log(hwndSNTP, "socket() failed"); return FALSE; } serveraddr = inet_addr(servername); // if server name is not "XXX.XXX.XXX.XXX" if(serveraddr == INADDR_NONE) { // request IP address m_pGetHost = malloc(MAXGETHOSTSTRUCT); m_hGetHost = WSAAsyncGetHostByName(hwndSNTP, WSOCK_GETHOST, servername, m_pGetHost, MAXGETHOSTSTRUCT); if(m_hGetHost == NULL) { free(m_pGetHost); m_pGetHost = NULL; SocketClose(hwndSNTP, "WSAAsyncGetHostByName() failed"); return FALSE; } return TRUE; } // send data SNTPSend(hwndSNTP, serveraddr); return TRUE; }
/*--------------------------------------------------- start SNTP session ---------------------------------------------------*/ void SNTPStart(HWND hwnd, char *buf) { char servername[256]; unsigned long serveraddr; if(g_socket != -1 || g_hGetHost != NULL) return; // get server name and port g_port = GetServerPort(buf, servername); if(g_port == -1) { Log("invalid server name"); return; } // make a socket g_socket = socket(PF_INET, SOCK_DGRAM, 0); if(g_socket == INVALID_SOCKET) { Log("socket() failed"); g_socket = (SOCKET)-1; return; } serveraddr = inet_addr((char*)servername); // if server name is not "XXX.XXX.XXX.XXX" if(serveraddr == -1) { // request IP address g_pGetHost = malloc(MAXGETHOSTSTRUCT); g_hGetHost = WSAAsyncGetHostByName(hwnd, WSOCK_GETHOST, servername, g_pGetHost, MAXGETHOSTSTRUCT); if(g_hGetHost == 0) { SocketClose(hwnd, "WSAAsyncGetHostByName() failed"); return; } dwTickCountOnGetHost = GetTickCount(); return; } // send data SNTPSend(hwnd, serveraddr); }