Sto lavorando a un sistema che esegue Linux incorporato. Sto cercando di ottenere il timestamp del pacchetto da un flusso che sto ricevendo su un socket.Ottenere la data/ora del pacchetto tramite la chiamata ioctl sul descrittore del file socket
Dopo aver creato il socket, faccio la seguente:
if (fd != -1) {
int enabled = 1;
setsockopt(fd, SOL_SOCKET, SO_TIMESTAMP, &enabled, sizeof(enabled);
}
Dopo che mi legano alla presa, la presa è di tipo SOCK_STREAM. Ricevo correttamente i dati sul socket, chiamando la funzione recv(fd, buf, size, 0)
. Ora, al fine di ottenere il timestamp dei dati ricevuti, Attualmente sto cercando il seguente:
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);
}
L'uscita del printf è sempre la seguente:
0,0 errore = - 1
l'errore = -1 indica che la chiamata ioctl ha fallito. Ho eseguito un test con getsockopt
per verificare se è impostata l'opzione SO_TIMESTAMP, getsockopt
restituisce 0 per l'opzione SO_TIMESTAMP quindi sembra impostato correttamente. Sono un po 'perso qui, come posso indagare ulteriormente perché la chiamata ioctl sembra fallire?
Guardando a [QUESTO] (https://vilimpoc.org/research/ku-latency/), sembra che "SO_TIMESTAMP' sia usato per impostare l'opzione, non per recuperare i dati. Devi usare [recvmsg] (http://linux.die.net/man/2/recvmsg) per ottenere informazioni. – LPs
Quando ricevi un errore da una chiamata di sistema dovresti stampare 'errno' o' strerror() 'o usare' perror() 'per farlo per te. Come hai scoperto, -1 non ti dice nulla di utile. – EJP