提升原始套接字
Posted
技术标签:
【中文标题】提升原始套接字【英文标题】:Boost raw sockets 【发布时间】:2015-06-17 19:14:02 【问题描述】:我知道这是一个非常理论的问题,但请原谅我,因为这不是我的专长。
寻找一个关于如何在 boost asio 中使用原始套接字的示例,我在同一个网站上发现了一个问题,可以确保您无法通过 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 标头。
(我很好奇我在代码中的任何地方都找不到“原始”这个词) 我的问题是:为什么这适用于 ICMP 而不是 UDP 或 TCP?是因为ICMP是3级吗?
这个例子到底是怎么工作的? ICMP 套接字是否等同于原始套接字?但我认为不应该。
【问题讨论】:
虽然 Boost.Asio 的udp::socket
执行 not expose the ability to identify a received datagram's destination address,但可以创建使用原始套接字的协议类型,允许应用程序处理网络和传输层标头。有关示例,请参见 here。
【参考方案1】:
boost::asio::ip::icmp::socket
是一个原始套接字。 ip::icmp
类型封装了用于 ICMP 的标志和类型。特别是ip::icmp::type()
的implementation 返回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
socket选项,所以内核在发送的时候会生成相应的IP头。
【讨论】:
以上是关于提升原始套接字的主要内容,如果未能解决你的问题,请参考以下文章