uint64_t网络位的时间间隔

时间:2019-07-11 15:24:30

标签: c timeval

我希望将timeval字段附加到我的自定义数据包头中。面对类型转换问题。

标题中的我的自定义字段

struct pkthdr {
    uint64_t sec;
    uint64_t usec;
}

Linux timeval结构

struct timeval {
    long tv_sec;        /* seconds */
    long tv_usec;   /* and microseconds */
}

初始化

struct pkthdr *hdr;
struct timeval *tm;
gettimeofday(&tm, 0);
hdr->sec = htonl(tm->tv_sec);
hdr->usec = htonl(tm->tv_usec);

以下几行导致细分错误

hdr->sec = htonl(tm->tv_sec);
hdr->usec = htonl(tm->tv_usec);

1 个答案:

答案 0 :(得分:0)

您已经创建了指向struct timevalstruct pkthdr的指针,但是实际上并未分配任何指向的内存,因此当您尝试为{{1}赋值时,您将调用未定义的行为。 }和hdr->sec

在传递hdr->usec而不是gettimeofday时,您还将错误的类型传递给struct timeval **

请尝试创建实际的结构,而不是指向它们的指针:

struct timeval

检查并确保struct pkthdr hdr; struct timeval tm; gettimeofday(&tm, NULL); hdr.sec = htonl(tm.tv_sec); hdr.usec = htonl(tm.tv_usec); hdr.sec中的数据确实是您想要的,因为这可能是不正确的。对于hdr.usec的使用,我有些保留,因为它处理32位数据,而您的预期结果是64位。