OSX等效于IP_RECVERR

kmd*_*ent 11 c linux macos network-programming traceroute

我正在尝试将TraceRoute程序从Linux移植到OSX,并且我无法找到IP_RECVERR等效项.

大多数人进行数据包解析的方式是:

setsockopt (sock, IPPROTO_IPV4, IP_RECVERR, &on, sizeof (on))
Run Code Online (Sandbox Code Playgroud)

然后,当数据包进入时,请执行以下操作:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

在OSX上也没有sock_extended_err是有问题的.我真的只需要知道是否有错误,以及错误源自何处.

Bri*_*era 1

抱歉,OS X 不支持扩展IP_RECVERR套接字功能。

您可以使用:#ifdef IP_RECVERR使其构建在不存在 RECVERR/ERRQUEUE 的 OS X 上。

但如果你正在寻找特定的代码执行,我认为你必须在 mac OS X 中移植IP_RECVERR套接字功能。MSG_ERRQUEUE这听起来就像“我有新东西要玩”。快乐编码。