Эквивалент OSX для IP_RECVERR
Я пытаюсь перенести программу TraceRoute из Linux в OSX, и мне трудно найти эквивалент IP_RECVERR.
Как большинство людей проводят парсинг пакетов:
setsockopt (sock, IPPROTO_IPV4, IP_RECVERR, &on, sizeof (on))
И затем, когда пакет входит, выполните что-то в строках:
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;
}
}
В OSX также нет sock_extended_err, что проблематично. Мне просто нужно знать, была ли ошибка, и откуда возникла ошибка.
Ответы
Ответ 1
Извините, но OS X не поддерживает расширенные возможности сокетов IP_RECVERR
.
Вы можете использовать: #ifdef IP_RECVERR
, чтобы создать его на OS X, где RECVERR/ERRQUEUE не существует.
Но если вы ищете выполнение этого конкретного кода, я думаю, что вам нужно использовать возможности сокетов IP_RECVERR
и MSG_ERRQUEUE
в Mac OS X. Это звучит так: "У меня появились новые вещи". Счастливое кодирование.