时间通过网络连接时间服务器设置本地时间

本文介绍了如何通过编写Socket客户端连接时间服务器,获取秒数来更新本地计算机的时间。

1、简单来说就是自己编写socket的client连接时间服务器、通过recv就会收到一个秒数..代码如下

// test.cpp.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <time.h>

#ifdef _WIN32
#include <Windows.h>  
#include <dos.h>
#include <WinSock.h>
#pragma comment(lib,"ws2_32.lib")
#else
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#endif

using namespace std;


int GetInternetTime(long long &ulTime )   //获取从1900年到现在的秒数
{
	int ret = -1;
	int Err_i = 0;
BEGIN:
#ifdef _WIN32
	WSADATA  Ws;
	if (WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
	{
		cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
		ret = -1;
	}
	SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
	if (s == INVALID_SOCKET) 
	{ 
		std::cout<<"create socket error"<<std::endl; 
		ret = -2; 
	} 
	sockaddr_in servAddr;
	memset(&servAddr,0,sizeof(sockaddr_in));
	servAddr.sin_family = AF_INET; 
	servAddr.sin_port = htons(37); 
	servAddr.sin_addr.S_un.S_addr = inet_addr("64.236.96.53");
	if (SOCKET_ERROR == connect(s, (sockaddr *)&servAddr, sizeof(servAddr))) 
	{ 
		std::cout<<"connect socket error"<<std::endl; 
		ret = -3; 
	} 
	int nRecv = recv(s, (char *)&ulTime, sizeof(ulTime), 0); 
	ulTime = ntohl(ulTime); 
	closesocket(s); 

#else
	struct sockaddr_in s_add,c_add;
	int cfd = socket(AF_INET, SOCK_STREAM, 0);
	if(int == cfd)
	{
		printf("socket fail ! \r\n");
		ret = -1; 
	}
	memset(&s_add,0,sizeof(struct sockaddr_in));
	s_add.sin_family=AF_INET;
	s_add.sin_addr.s_addr= inet_addr("64.236.96.53");
	s_add.sin_port=htons(37);

	if(int == connect(cfd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))
	{
		printf("connect fail !\r\n");
		ret = -1; 
	}
	if(int ==  read(cfd,(char *)&ulTime,1024))
	{
		printf("read data fail !\r\n");
		ret = -3; 
	}
	ulTime = ntohl(ulTime); 
	close(cfd);

#endif
	if(ulTime > 0)
		ret = 0;
	else if(Err_i++ < 3) //连接失败、以及获取时间失败重新连接最多失败三次
		goto BEGIN;
	return ret;
}

int main()
{
	long long a = 0;
	if(!GetInternetTime(a))
		cout<<a<<endl;
	/*获取1900年到现在的秒数、转为本地时间。
	 *注意:因为电脑上的时间基本都是从1970年开始算起的、所有转换之后应该减掉70年*/
	struct tm *t;
	/*转为国际时间*/
	t = gmtime(&a); 
	printf("%04d-%02d-%02d %02d:%02d:%02d\n"
								, t->tm_year +1900 - 70
								, t->tm_mon + 1
								, t->tm_mday 
								, t->tm_hour //国际时间
								, t->tm_min
								, t->tm_sec);
	/*转为本地时间*/
	t = localtime(&a);
	printf("%04d-%02d-%02d %02d:%02d:%02d\n"
								, t->tm_year +1900 - 70
								, t->tm_mon + 1
								, t->tm_mday 
								, t->tm_hour //本地时区的时间
								, t->tm_min
								, t->tm_sec);
	getchar();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值