提升原始套接字

时间:2015-06-17 19:14:02

标签: udp boost-asio icmp

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

寻找一个关于如何使用带有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标头。

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

这个例子怎么可以工作? ICMP套接字是否等同于原始套接字?但我认为不应该这样。

1 个答案:

答案 0 :(得分:1)

boost::asio::ip::icmp::socket是一个原始套接字。 ip::icmp类型封装了用于ICMP的标志和类型。特别是,implementationip::icmp::type()会返回SOCK_RAW

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

由于icmp::socket的协议类型是raw,ICMP example将接收网络层数据(IP头和ICMP)。此外,ip::icmp的协议为IPPROTO_ICMP,Boost.Asio未设置IP_HDRINCL套接字选项,因此内核将在发送时生成相应的IP标头。

相关问题