【问题标题】:windows linux timestamping c++ errorwindows linux时间戳c ++错误
【发布时间】:2014-07-18 22:07:19
【问题描述】:

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

用于获取时间戳的函数如下:

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

在客户端代码中,时间戳被打包发送如下:

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;

在服务端代码中,收到时解包时间戳如下:

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 将数据从缓冲区复制到给定的引用。

编辑:

平台定义:

#ifdef _WIN32
#define PLATFORM PLATFORM_WINDOWS
#elif defined __linux__
#define PLATFORM PLATFORM_LINUX
#else
#define PLATFORM PLATFORM_UNKOWN
#endif

【问题讨论】:

  • 你不能指望两个不同步的源的时间是相同的
  • 那么如何计算延迟?
  • @joelyboy94:您将时间戳发送到服务器,服务器将完全相同的数据包发送回您的客户端,然后您可以通过再次调用 Timestamp() 来计算差异。此外,您不需要毫秒精度的低/高,只需在发送前将其修剪为 32 位无符号整数(这对大约 49 天有好处)。
  • @joelyboy94:还请记住,gettimeofday() 之类的函数可能会失败 - 所以一定要检查它的返回值。
  • @joelyboy94:另一件事:不要使用#if PLATFORM==PLATFORM_WINDOWS,最好使用#ifdef _WIN32(也适用于x64)和#ifdef __linux__ 用于Linux。你不需要自己定义它。

标签: c++ networking timestamp endianness


【解决方案1】:

,一个虚拟数据包,因为您的服务器和您的客户端计算机系统时钟不同步。

你可以:

  1. 测量来自服务器的 ping(往返行程或 RTT 时间) machine),为了使用单个时钟

  2. 同步您的 机器时钟(取决于预期的精度,它可能是 挺难的)。请参阅 NTPPTP 同步协议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多