ntp时间获取
//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;
}
?
總結
- 上一篇: vc++6.0 同步本机时间到Inter
- 下一篇: 驱动开发相关资料