c++通过http协议校时
由于IP黑白名单的限制,我们能访问的ip和域名资源非常有限,现将通过http协议授时方法整理如下:
#include <cstdio>#include <string.h>
#include <curl/curl.h>
#include <iostream>
int getNetWorkingTime(char* reBuff, size_t reSize, const char* httpurl = "http://www.510link.com");
size_t readStringBuffFunc(char* data, size_t size, size_t nmemb, void* userStr); //解析data
size_t readStringKey(const char* sourceChr, const char* key, char* returnChr);
int main()
{
char time[60]={0};
if (GetNetWorkingTime(time,sizeof(time)))
{
std::cout << "ok" << std::endl;
}
else
{
printf("%s 向你问好!\n", "HttpClientTime");
}
return 0;
}
/******************************************************************************
* Name : HttpClient::writeFunc
* Author : cqnews
* Version : V1.0.0
* Data : 2021.08.12
* Describe : 解析data
******************************************************************************/
size_t readStringBuffFunc(char* data, size_t size, size_t nmemb, void* userStr)
{
int res = -1;
if (userStr != NULL)
{
((std::string*)userStr)->append((char*)data, size * nmemb);
return size * nmemb;
}
return res;
}
/******************************************************************************
* Name : HttpClient::GetNetWorkingTime
* Author : cqnews
* Version : V1.0.0
* Data : 2021.08.30
* Describe : 检查联网状态
******************************************************************************/
int getNetWorkingTime(char* reBuff, size_t reSize, const char* httpurl)
{
//创建curl对象
CURL* curl;
//创建curlcode对象
CURLcode res;
int ret = 0;
curl = curl_easy_init();
if (curl)
{
std::string readHeader = "";
//设置一个请求文件地址
curl_easy_setopt(curl, CURLOPT_URL, httpurl);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5);//设置超时时间
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5);//设置超时时间
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, readStringBuffFunc);
curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void*)&readHeader);
curl_easy_setopt(curl, CURLOPT_HEADER, 0); //只需要header头
curl_easy_setopt(curl, CURLOPT_NOBODY, 1); //不需要body
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
//执行请求操作,将返回值交给res
res = curl_easy_perform(curl);
//res=0的情况表示接收到信息,反之则没有收到信息
if (res == CURLE_OK)
{
readHeader = strstr(readHeader.c_str(), "Date: ");
char dateChr[60] = { 0 };
for (int i = 0; i < 60; i++)
{
if (readHeader[i] == '\n' || readHeader[i] == '\r' || readHeader[i] == '\0'){break;}
dateChr[i] = readHeader[i];
}
std::cout << "dateChr:" << dateChr << std::endl;
char* dateChr2 = dateChr;
dateChr2 += strlen("Date: ");
std::cout << "dateChr2:" << dateChr2 << std::endl;
tm tm_;
strptime(dateChr2, "%a, %d %b %Y %H:%M:%S GMT", &tm_); //将字符串转换为tm时间
tm_.tm_hour += 8;
char tempBuff[30] = { 0 };
strftime(tempBuff, 30, "%Y-%m-%d %H:%M:%S", &tm_);
std::cout << "timeBuff:" << tempBuff << std::endl;
std::string commandStr = "time -s";
commandStr.append(tempBuff);
memcpy(reBuff, tempBuff, min(strlen(tempBuff), reSize));
memset(dateChr, 0, sizeof(dateChr));
memset(tempBuff, 0, sizeof(tempBuff));
if (curl) { curl_easy_cleanup(curl); }
//已经联网
return 0;
}
else
{
//没有联网
}
/* 释放资源 */
if (curl) { curl_easy_cleanup(curl); }
}
return -1;
}
测试效果如下

浙公网安备 33010602011771号