提升原始套接字

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_HDRINCLsocket选项,所以内核在发送的时候会生成相应的IP头。

【讨论】:

以上是关于提升原始套接字的主要内容,如果未能解决你的问题,请参考以下文章

原始套接字的问题

原始套接字

原始套接字

Linux Socket 原始套接字编程

原始套接字编程

原始套接字