//ntp时间获取
char szIP[512]={0};
BOOL bF = HostNameToIP("www.google.com",szIP);
if (bF)
{
printf("%s/n",szIP);
}
SYSTEMTIME time;
BOOL bFlag=GetCurTime(time,"61.153.197.226");
char szUrl[512]={0};
BOOL bFl=IPToHostName("74.125.153.99",szUrl);
if(bFl){
printf("%s/n",szUrl);
}
//ntp.h
///
BOOL GetCurTime(SYSTEMTIME& time,char* ip);
bool HostNameToIP(char* HostName,char* ip);
bool IPToHostName(char* ip,char* HostName);
//ntp.cpp
///
#include "StdAfx.h" //预处理头
#include "windows.h"
#include "time.h"
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib")
struct NTP_Packet{
int Control_Word;
int root_delay;
int root_dispersion;
int reference_identifier;
__int64 reference_timestamp;
__int64 originate_timestamp;
__int64 receive_timestamp;
int transmit_timestamp_seconds;
int transmit_timestamp_fractions;
};
/** 本地时间 */
BOOL GetCurTime(SYSTEMTIME& time,char* ip)
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 1, 1 );
if (0!=WSAStartup(wVersionRequested, &wsaData))
{
WSACleanup();
return 0;
}
if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup( );
return 0;
}
SOCKET soc=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
struct sockaddr_in addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr(ip);//inet_addr("192.43.244.18");
// addrSrv.sin_addr.S_un.S_addr=inet_addr("210.72.145.44");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(123);
NTP_Packet NTP_Send,NTP_Recv;
NTP_Send.Control_Word = htonl(0x0B000000);
NTP_Send.root_delay = 0;
NTP_Send.root_dispersion = 0;
NTP_Send.reference_identifier = 0;
NTP_Send.reference_timestamp = 0;
NTP_Send.originate_timestamp = 0;
NTP_Send.receive_timestamp = 0;
NTP_Send.transmit_timestamp_seconds = 0;
NTP_Send.transmit_timestamp_fractions = 0;
if(SOCKET_ERROR==sendto(soc,(const char*)&NTP_Send,sizeof(NTP_Send),
0,(struct sockaddr*)&addrSrv,sizeof(addrSrv)))
{
closesocket(soc);
return 0;
}
int sockaddr_Size =sizeof(addrSrv);
if(SOCKET_ERROR==recvfrom(soc,(char*)&NTP_Recv,sizeof(NTP_Recv),
0,(struct sockaddr*)&addrSrv,&sockaddr_Size))
{
closesocket(soc);
return 0;
}
closesocket(soc);
WSACleanup();
SYSTEMTIME newtime;
struct tm *lpLocalTime;
float Splitseconds;
time_t ntp_time=ntohl(NTP_Recv.transmit_timestamp_seconds)-2208988800;
lpLocalTime=localtime(&ntp_time);
if(lpLocalTime==NULL)
{
return 0;
}
newtime.wYear =lpLocalTime->tm_year+1900;
newtime.wMonth =lpLocalTime->tm_mon+1;
newtime.wDayOfWeek =lpLocalTime->tm_wday;
newtime.wDay =lpLocalTime->tm_mday;
newtime.wHour =lpLocalTime->tm_hour;
newtime.wMinute =lpLocalTime->tm_min;
newtime.wSecond =lpLocalTime->tm_sec;
Splitseconds=(float)ntohl(NTP_Recv.transmit_timestamp_fractions);
Splitseconds=(float)0.000000000200 * Splitseconds;
Splitseconds=(float)1000.0 * Splitseconds;
newtime.wMilliseconds = (unsigned short)Splitseconds;
time= newtime;
return TRUE;
}
/** 主机名解析为ip */
bool HostNameToIP(char* HostName,char* ip)
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 1, 1 );
if (0!=WSAStartup(wVersionRequested, &wsaData))
{
WSACleanup();
return false;
}
if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup( );
return false;
}
char *pURL=HostName;
struct hostent *hp;
char **p;
hp = gethostbyname(pURL);
if(hp==NULL) {return false; }
for (p = hp->h_addr_list; *p ; p++) //循环显示所有IP
{
char *sIP;
sIP = inet_ntoa(*(struct in_addr*)*p);
CString strIP = sIP;
// printf("%s/r/n",strIP.GetBuffer(0));
int pos=strlen(ip);
strcat(ip,strIP.GetBuffer(0));
strcat(ip,",");
}
WSACleanup();
return true;
}
/** ip地址解析为主机名 */
bool IPToHostName(char* ip,char* url)
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 1, 1 );
if (0!=WSAStartup(wVersionRequested, &wsaData))
{
WSACleanup();
return false;
}
if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup( );
return false;
}
//--------------------转换过程--------------------------[
u_long addr;
struct hostent *hp;
char **p;
if ((int)(addr = inet_addr(ip)) == -1) {
return false;
}
hp = gethostbyaddr((char *)&addr, sizeof (addr), AF_INET);
if (hp == NULL) {
return false;
}
strcpy(url,hp->h_name);
//--------------------转换过程--------------------------]
WSACleanup();
return true;
}