提升原始套接字

Boost raw sockets

我知道这是一个非常理论化的问题,但请原谅我,因为这不是我的专长。

在寻找有关如何将原始套接字与 boost 结合使用的示例时,我在同一网站上发现了一个问题,确保您无法通过 boost asio 知道 UDP 消息的目的地。 然后看一下 boost 示例,有一个 icmp 示例: http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/icmp/ping.cpp 通过使用 async_receive 和 icmp 端点,您实际上可以同时拥有 IP 和 ICMP headers。

(我很好奇我在代码中的任何地方都找不到 "raw" 这个词) 我的问题是:为什么这适用于 ICMP 而不适用于 UDP 或 TCP?是因为 ICMP 是 3 级吗?

这个例子怎么能行得通? ICMP套接字是否等同于原始套接字?但我认为不应该。

boost::asio::ip::icmp::socket is a raw socket. The ip::icmp type encapsulates flags and types used for ICMP. In particular, the implementation of ip::icmp::type() returns SOCK_RAW:

/// Obtain an identifier for the type of the protocol.
int type() const
{
  return BOOST_ASIO_OS_DEF(SOCK_RAW);
}

由于icmp::socket的协议类型是原始的,ICMP example将接收网络层数据(IP报头和ICMP)。另外,ip::icmp的协议是IPPROTO_ICMP,而Boost.Asio没有设置IP_HDRINCL套接字选项,所以内核在发送时会生成合适的IP头。