2015-04-28 21 views
11

Sto provando a eseguire il porting di un programma TraceRoute da Linux a OSX e ho difficoltà a trovare l'equivalente IP_RECVERR.equivalente OSX per IP_RECVERR

Il modo in cui la maggior parte delle persone fanno il parsing del pacchetto è:

setsockopt (sock, IPPROTO_IPV4, IP_RECVERR, &on, sizeof (on)) 

E poi, quando il pacchetto arriva a fare qualcosa sulla falsariga di:

sock_extended_err* err = nullptr; 
for (cmsghdr* cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) { 
    switch (cmsg->cmsg_level) { 
    case IPPROTO_IPV4: 
     if (cmsg->cmsg_type == IP_RECVERR) { 
     err = (sock_extended_err*)CSMSG_DATA(cmsg); 
     } 
     break; 
    } 
} 

Non C'è anche un sock_extended_err su OSX che è problematico. Ho davvero bisogno di sapere se ho avuto un errore, e dove l'errore ha avuto origine.

+0

Su 'OS X' la cosa più vicina (cioè integrata) sarebbe probabilmente' SO_ERROR'. –

+0

Non sembra che abbia un errore "TTL ottenuto a 0". – kmdent

+0

Quando si utilizza 'IP_RECVERR' quale tipo di valore restituisce? Se vuoi ottenere il valore 'TTL' attuale devi usare qualcosa come' getsockopt (fd, SOL_SOCKET, SO_ERROR, & errcode, &len); ' –

risposta

1

Spiacente, ma OS X non supporta le funzionalità estese del socket IP_RECVERR.

È possibile utilizzare: #ifdef IP_RECVERR per crearlo su OS X in cui RECVERR/ERRQUEUE non esistono.

Ma se siete alla ricerca di quel particolare l'esecuzione di codice, io penso che si debba porta IP_RECVERR capacità di presa & MSG_ERRQUEUE in Mac OS X. Questo è il suono del tipo "Ho cose nuove da giocare". Buona programmazione.

+0

Anche se questo non risolve il problema, Non lascerò perdere quella taglia! – kmdent

+0

Grazie amico .. –