Pracuję na systemie z wbudowanym systemem Linux. Próbuję uzyskać znacznik czasu pakietu ze strumienia, który odbieram na gnieździe.Uzyskaj sygnaturę czasową pakietu przez wywołanie ioctl na deskryptorze pliku gniazda
Po utworzeniu gniazda, to należy wykonać następujące czynności:
if (fd != -1) {
int enabled = 1;
setsockopt(fd, SOL_SOCKET, SO_TIMESTAMP, &enabled, sizeof(enabled);
}
Potem wiążą gnieździe, gniazdo jest typu SOCK_STREAM. Pomyślnie odbieram dane na gnieździe, dzwoniąc do funkcji recv(fd, buf, size, 0)
. Teraz w celu uzyskania znacznika czasu odebranych danych, Obecnie próbuję następujący:
ret = recv(fd, buf, size, 0);
if (ret > 0) {
struct timeval tv_ioctl;
tv_ioctl.tv_sec = 0;
tv_ioctl.tv_usec = 0;
int error = ioctl(fd, SO_TIMESTAMP, &tv_ioctl);
printf("%ld.%ld - error = %d", (long int)tv_ioctl.tv_sec,
(long int)tv_ioctl.tv_usec, error);
}
wyjściu instrukcji printf zawsze jest następujący:
0,0 błędu = - 1
błąd = 1 oznacza, że wywołanie ioctl nie powiodło się. Przeprowadziłem test z getsockopt
, aby sprawdzić, czy ustawiono opcję SO_TIMESTAMP, getsockopt
zwraca 0 dla opcji SO_TIMESTAMP, więc wydaje się poprawnie ustawione. Jestem trochę zagubiony, jak mogę dalej badać, dlaczego wywołanie ioctl wydaje się być nieskuteczne?
Patrząc na [TO] (https://vilimpoc.org/research/ku-latency/), wydaje się, że 'SO_TIMESTAMP' służy do ustawienia opcji, a nie do pobierania danych. Aby uzyskać informacje, musisz użyć [recvmsg] (http://linux.die.net/man/2/recvmsg). – LPs
Gdy pojawi się błąd z wywołania systemowego, powinieneś wydrukować 'errno' lub' strerror() 'lub użyć' perror() ', aby zrobić to za Ciebie. Jak już odkryłeś, -1 nie mówi ci nic przydatnego. – EJP