время до битов сети uint64_t - PullRequest
0 голосов
/ 11 июля 2019

Я хочу добавить временные поля в мой пользовательский заголовок пакета.Возникли проблемы с преобразованием типов.

Мои настраиваемые поля в заголовке

struct pkthdr {
    uint64_t sec;
    uint64_t usec;
}

Linux timeval struct

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 голосов
/ 11 июля 2019

Вы создали указатели на struct timeval и struct pkthdr, но на самом деле вы не выделили никакой памяти, на которую можно указать, поэтому вы вызываете неопределенное поведение, когда пытаетесь присвоить значение 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 действительно соответствуют вашим ожиданиям, поскольку это может быть неверно. У меня есть некоторые оговорки по поводу использования htonl, так как это относится к 32-битным данным, в то время как ваш ожидаемый результат - 64 бит.

...