提升原始套接字
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头。
我知道这是一个非常理论化的问题,但请原谅我,因为这不是我的专长。
在寻找有关如何将原始套接字与 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头。