1 // 2 // ip/icmp.hpp 3 // ~~~~~~~~~~~ 4 // 5 // Copyright (c) 2003-2021 Christopher M. Kohlhoff (chris at kohlhoff dot com) 6 // 7 // Distributed under the Boost Software License, Version 1.0. (See accompanying 8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 // 10 11 #ifndef BOOST_ASIO_IP_ICMP_HPP 12 #define BOOST_ASIO_IP_ICMP_HPP 13 14 #if defined(_MSC_VER) && (_MSC_VER >= 1200) 15 # pragma once 16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) 17 18 #include <boost/asio/detail/config.hpp> 19 #include <boost/asio/detail/socket_types.hpp> 20 #include <boost/asio/basic_raw_socket.hpp> 21 #include <boost/asio/ip/basic_endpoint.hpp> 22 #include <boost/asio/ip/basic_resolver.hpp> 23 #include <boost/asio/ip/basic_resolver_iterator.hpp> 24 #include <boost/asio/ip/basic_resolver_query.hpp> 25 26 #include <boost/asio/detail/push_options.hpp> 27 28 namespace boost { 29 namespace asio { 30 namespace ip { 31 32 /// Encapsulates the flags needed for ICMP. 33 /** 34 * The boost::asio::ip::icmp class contains flags necessary for ICMP sockets. 35 * 36 * @par Thread Safety 37 * @e Distinct @e objects: Safe.@n 38 * @e Shared @e objects: Safe. 39 * 40 * @par Concepts: 41 * Protocol, InternetProtocol. 42 */ 43 class icmp 44 { 45 public: 46 /// The type of a ICMP endpoint. 47 typedef basic_endpoint<icmp> endpoint; 48 49 /// Construct to represent the IPv4 ICMP protocol. v4()50 static icmp v4() BOOST_ASIO_NOEXCEPT 51 { 52 return icmp(BOOST_ASIO_OS_DEF(IPPROTO_ICMP), 53 BOOST_ASIO_OS_DEF(AF_INET)); 54 } 55 56 /// Construct to represent the IPv6 ICMP protocol. v6()57 static icmp v6() BOOST_ASIO_NOEXCEPT 58 { 59 return icmp(BOOST_ASIO_OS_DEF(IPPROTO_ICMPV6), 60 BOOST_ASIO_OS_DEF(AF_INET6)); 61 } 62 63 /// Obtain an identifier for the type of the protocol. type() const64 int type() const BOOST_ASIO_NOEXCEPT 65 { 66 return BOOST_ASIO_OS_DEF(SOCK_RAW); 67 } 68 69 /// Obtain an identifier for the protocol. protocol() const70 int protocol() const BOOST_ASIO_NOEXCEPT 71 { 72 return protocol_; 73 } 74 75 /// Obtain an identifier for the protocol family. family() const76 int family() const BOOST_ASIO_NOEXCEPT 77 { 78 return family_; 79 } 80 81 /// The ICMP socket type. 82 typedef basic_raw_socket<icmp> socket; 83 84 /// The ICMP resolver type. 85 typedef basic_resolver<icmp> resolver; 86 87 /// Compare two protocols for equality. operator ==(const icmp & p1,const icmp & p2)88 friend bool operator==(const icmp& p1, const icmp& p2) 89 { 90 return p1.protocol_ == p2.protocol_ && p1.family_ == p2.family_; 91 } 92 93 /// Compare two protocols for inequality. operator !=(const icmp & p1,const icmp & p2)94 friend bool operator!=(const icmp& p1, const icmp& p2) 95 { 96 return p1.protocol_ != p2.protocol_ || p1.family_ != p2.family_; 97 } 98 99 private: 100 // Construct with a specific family. icmp(int protocol_id,int protocol_family)101 explicit icmp(int protocol_id, int protocol_family) BOOST_ASIO_NOEXCEPT 102 : protocol_(protocol_id), 103 family_(protocol_family) 104 { 105 } 106 107 int protocol_; 108 int family_; 109 }; 110 111 } // namespace ip 112 } // namespace asio 113 } // namespace boost 114 115 #include <boost/asio/detail/pop_options.hpp> 116 117 #endif // BOOST_ASIO_IP_ICMP_HPP 118