我知道这是一个非常理论化的问题,但请原谅我,因为这不是我的专长。
寻找一个关于如何使用带有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套接字是否等同于原始套接字?但我认为不应该这样。
答案 0 :(得分:1)
boost::asio::ip::icmp::socket
是一个原始套接字。 ip::icmp
类型封装了用于ICMP的标志和类型。特别是,implementation的ip::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标头。