您的位置:首页 > 理论基础 > 计算机网络

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

2013-03-18 15:45 531 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: