我正在尝试编写时间戳代码以通过以毫秒为单位发送时间戳来计算延迟。服务器代码在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

最佳答案

,因为您的服务器和客户端计算机系统时钟不同步。

您可以 :


从服务器测量ping(往返或RTT时间)
机器),以便使用单个时钟
同步你的
机器时钟(取决于预期的精度,可能是
挺难的)。请参见NTPPTP同步协议。

关于c++ - Windows Linux时间戳C++错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23932712/

10-11 22:23
查看更多