c++ - windows linux 时间戳 c++ 错误

标签 c++ networking timestamp endianness

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

最佳答案

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

你可以:

  1. 测量来自服务器的 ping(往返或 RTT 时间) 机),以便使用单个时钟

  2. 同步你的 机器时钟(取决于预期的准确性,它可能是 挺难的)。参见 NTPPTP同步协议(protocol)。

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

相关文章:

C++,关于继承的基础知识

c++ - 如何在模板基类中调用模板成员函数?

c - 在单个 DNS 查询中请求 A 和 AAAA 记录

c - 如何在 NetSim 中编写自己的代码?

c++ - 在编译时使用 C++ 在目标代码中嵌入时间戳

c++ - 全局变量的分配 C++

c++ - 如何在 vector 列表初始化时避免对象复制以及如何延长临时对象的生命周期

javascript - 将日期和时间戳与时区进行比较

c++ - 何时创建多少个线程?

java - 将区域设置日期字符串转换为时间戳。 Java/安卓