首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >时间服务器时间类型问题

时间服务器时间类型问题
EN

Stack Overflow用户
提问于 2014-06-26 16:07:10
回答 1查看 311关注 0票数 3

因此,我在linux上用C编写了一个时间服务器客户机应用程序,它应该向客户机发送当前的unix时间戳。

它可以很好地工作,但是我被告知time_t可能并不总是大小和字节顺序相同的。如何确保发送客户始终理解的时间?

到现在为止,我只知道

代码语言:javascript
运行
复制
time_t now = htonl(time(0));

然后发过来。

我在google和stackoverflow上搜索,但似乎其他人只发送由ctime()或strftime()生成的时间字符串。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-26 16:40:48

由于发送者和接收方的解释方式不同,一般发送的二进制数据容易出错。

特别是对于time_t,甚至不清楚将涉及多少位,可能是32位或64位,甚至是更复杂的东西,因为time_t甚至可能被实现为struct

在使用htonl()的特殊情况下,假定为32位,因为htonl()的值为32位。

因此,故障安全解决方案确实是发送一个系统时间的文本表示。

从编程上看,这可能如下所示:

代码语言:javascript
运行
复制
char st[64] = "";

{
  struct * tm = gmtime(time(NULL));
  if (NULL == tm)
  {
    fprintf(stderr, "gmtime() failed\n");
  }
  {
    if(0 == strftime(st, sizeof(st), "%s", tm)) /* Prints the text representaiotn of the seconds since Epoch into st. */
    {
      fprintf(stderr, "strftime() failed\n");
    }
  }
}

要逆转此操作,可以使用strptime()

代码语言:javascript
运行
复制
char st[64] = "123456789123";
time_t t;
memset(&t, 0, sizeof(t));
{
  struct tm = {0};
  char p = strptime(t, "%s", &tm);
  if (NULL == p || p != (t + strlen(t)))
  {
    fprintf(stderr, "strptime() failed\n");
  }
  else
  {
    t = mktime(&tm);
  }
}

使用strptime()strftime()的好处是,您可以轻松地更改传输中日期/时间的格式,只需按调用这两个函数时指定的格式进行修改即可。

"%s"更改为"%Y-%m-%d %H:%M:%S"将像"2014-05-20 13:14:15"一样传输时间。

但是,如果您真的想以二进制格式发送自Epoch以来的秒数,并且保持故障安全和可移植性,那么您需要处理三件事:

  1. 以便携方式获取自Epoch以来的秒数。
  2. 选择一个足够大的整数类型。
  3. 将这个“大”值转换为网络字节顺序。

解决这一问题的一个可能办法是:

代码语言:javascript
运行
复制
#include <time.h>
#include <inttypes.h> /* For uint64_t, as 64bit should do to represent the seconds since Epoch for the next few years. */

...

time_t t_epochbegin;
memset(&t_epochbegin, 0, sizeof(t_epochbegin);
uint64_t t_host = (uint64_t) difftime(time(NULL), t_epochbegin); /* Get the seconds since Epoch without relying on time_t being an integer. */
uint64_t t_network = htonll(t_host); /* Convert to network byte order. */

关于如何实现非标准htonll(),请参阅对此问题的各种答案:Big Endian and Little Endian support for byte ordering

上面示例中的所有代码都假设代码运行的系统提供了一个计时器,尽管对time()的调用不会失败。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24435367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档