Эквивалент 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. Это звучит так: "У меня появились новые вещи". Счастливое кодирование.