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;
}

 

测试效果如下

 

posted @ 2023-02-14 15:48  流逝的轻风  阅读(228)  评论(0)    收藏  举报