首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >windows linux时间戳c++错误

问windows linux时间戳c++错误
EN

Stack Overflow用户
提问于 2014-05-29 19:53:36
回答 1查看 111关注 0票数 1

我正在尝试编写时间戳代码,通过发送以毫秒为单位的时间戳来计算延迟。服务器代码在linux上运行,而客户端在windows上运行:

获取时间戳的函数如下:

代码语言:javascript
复制
uint64_t TimeStamp() {
    uint64_t ll_now;
#if PLATFORM==PLATFORM_WINDOWS
    FILETIME ft_now; 
    GetSystemTimeAsFileTime(&ft_now);
    ll_now = (uint64_t)ft_now.dwLowDateTime + ((uint64_t)(ft_now.dwHighDateTime) << 32LL);
    ll_now -= 116444736000000000LL;
    ll_now /= 10000;
#elif PLATFORM==PLATFORM_LINUX
    timeval end;
    gettimeofday( (timeval*)&end,NULL );
    ll_now=(uint64_t)(end.tv_usec)/1000LL;
    ll_now += ((uint64_t)(end.tv_sec) * 1000LL);
#endif
    return ll_now;
}

在客户端代码中,时间戳按如下方式打包以供发送:

代码语言:javascript
复制
uint64_t tmstamp= TimeStamp();
uint32_t ts_high=((uint32_t)(tmstamp>>32LL));
uint32_t ts_low =((uint32_t)(tmstamp & 0xFFFFFFFFLL));
ts_high=htonl(ts_high);
ts_low=htonl(ts_low);
StdOPacket p;
p<<ts_high<<ts_low;

在服务器代码中,时间戳在收到时被解包,如下所示:

代码语言:javascript
复制
uint32_t ts_high,ts_low;
input>>ts_high>>ts_low;
ts_high=ntohl(ts_high);
ts_low=ntohl(ts_low);
uint64_t sndTS=uint64_t(ts_low)+(uint64_t(ts_high)<<32LL);
uint64_t curTS=TimeStamp();
int64_t dif=(int64_t)curTS-(int64_t)sndTS;
std::cout<<"current timestamp: "<<curTS<<std::endl;
std::cout<<"send timestamp: "<<sndTS<<std::endl;
std::cout<<"dif: "<<dif<<std::endl;

然而,当我运行程序时,差值被计算为大约-1000(ms),这违反了时间定律?

注意: StdOPacket只是将给定的数据指针复制到缓冲区中,而StdIPacket将数据从缓冲区复制到给定的引用中。

编辑:

平台定义:

代码语言:javascript
复制
#ifdef _WIN32
#define PLATFORM PLATFORM_WINDOWS
#elif defined __linux__
#define PLATFORM PLATFORM_LINUX
#else
#define PLATFORM PLATFORM_UNKOWN
#endif
EN

回答 1

Stack Overflow用户

发布于 2014-05-29 20:48:07

你的服务器和你的客户端系统的时钟是不同步的。

您可以:

  1. 测量ping (往返,或RTT,时间,从服务器机器),以便使用单个时钟
  2. 同步您的机器时钟(取决于预期的精度,这可能是相当困难的)。请参见NTP和PTP同步协议。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23932712

复制
相关文章

相似问题

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