2015-04-28 17 views
11

Próbuję przenieść program TraceRoute z Linuxa na OSX i mam problem ze znalezieniem równoważnika IP_RECVERR.Odpowiednik OSX dla IP_RECVERR

Sposób większość ludzi parsowania pakietu jest:

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

A potem, kiedy pakiet przychodzi zrobić coś wzdłuż linii:

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; 
    } 
} 

Istnieje również nie jest na sock_extended_err OSX, który jest problematyczny. Naprawdę muszę tylko wiedzieć, czy wystąpił błąd i gdzie powstał błąd.

+0

Na "OS X" najbliższą rzeczą (wbudowaną) będzie prawdopodobnie "SO_ERROR". –

+0

Wygląda na to, że nie ma błędu "TTL get to 0". – kmdent

+0

Kiedy używasz 'IP_RECVERR' jaki typ wartości zwraca? Jeśli chcesz uzyskać rzeczywistą wartość 'TTL' musisz użyć czegoś takiego jak' getsockopt (fd, SOL_SOCKET, SO_ERROR i errcode, &len); ' –

Odpowiedz

1

Niestety, ale OS X nie obsługuje rozszerzonych możliwości gniazd IP_RECVERR.

Możesz użyć: #ifdef IP_RECVERR, aby zbudować na OS X, gdzie RECVERR/ERRQUEUE nie istnieje.

Ale jeśli szukasz konkretnej wykonanie kodu, myślę, że masz do portu IP_RECVERR gniazdka zdolności & MSG_ERRQUEUE dźwiękiem Mac OS X. Thats jak „Mam nowe rzeczy do zabawy”. Szczęśliwe kodowanie.

+0

Chociaż to nie rozwiązuje problemu, Nie pozwolę, by ta nagroda zmarnowała się! – kmdent

+0

Dziękuję człowieku .. –