diff options
Diffstat (limited to '3rdparty/asio/src/examples/cpp03/icmp')
-rw-r--r-- | 3rdparty/asio/src/examples/cpp03/icmp/.gitignore | 10 | ||||
-rw-r--r-- | 3rdparty/asio/src/examples/cpp03/icmp/icmp_header.hpp | 94 | ||||
-rw-r--r-- | 3rdparty/asio/src/examples/cpp03/icmp/ipv4_header.hpp | 102 | ||||
-rw-r--r-- | 3rdparty/asio/src/examples/cpp03/icmp/ping.cpp | 161 |
4 files changed, 0 insertions, 367 deletions
diff --git a/3rdparty/asio/src/examples/cpp03/icmp/.gitignore b/3rdparty/asio/src/examples/cpp03/icmp/.gitignore deleted file mode 100644 index 62ea912e2e4..00000000000 --- a/3rdparty/asio/src/examples/cpp03/icmp/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -.deps -.dirstamp -*.o -*.obj -*.exe -ping -*.ilk -*.manifest -*.pdb -*.tds diff --git a/3rdparty/asio/src/examples/cpp03/icmp/icmp_header.hpp b/3rdparty/asio/src/examples/cpp03/icmp/icmp_header.hpp deleted file mode 100644 index 3b7b4bf5032..00000000000 --- a/3rdparty/asio/src/examples/cpp03/icmp/icmp_header.hpp +++ /dev/null @@ -1,94 +0,0 @@ -// -// icmp_header.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ICMP_HEADER_HPP -#define ICMP_HEADER_HPP - -#include <istream> -#include <ostream> -#include <algorithm> - -// ICMP header for both IPv4 and IPv6. -// -// The wire format of an ICMP header is: -// -// 0 8 16 31 -// +---------------+---------------+------------------------------+ --- -// | | | | ^ -// | type | code | checksum | | -// | | | | | -// +---------------+---------------+------------------------------+ 8 bytes -// | | | | -// | identifier | sequence number | | -// | | | v -// +-------------------------------+------------------------------+ --- - -class icmp_header -{ -public: - enum { echo_reply = 0, destination_unreachable = 3, source_quench = 4, - redirect = 5, echo_request = 8, time_exceeded = 11, parameter_problem = 12, - timestamp_request = 13, timestamp_reply = 14, info_request = 15, - info_reply = 16, address_request = 17, address_reply = 18 }; - - icmp_header() { std::fill(rep_, rep_ + sizeof(rep_), 0); } - - unsigned char type() const { return rep_[0]; } - unsigned char code() const { return rep_[1]; } - unsigned short checksum() const { return decode(2, 3); } - unsigned short identifier() const { return decode(4, 5); } - unsigned short sequence_number() const { return decode(6, 7); } - - void type(unsigned char n) { rep_[0] = n; } - void code(unsigned char n) { rep_[1] = n; } - void checksum(unsigned short n) { encode(2, 3, n); } - void identifier(unsigned short n) { encode(4, 5, n); } - void sequence_number(unsigned short n) { encode(6, 7, n); } - - friend std::istream& operator>>(std::istream& is, icmp_header& header) - { return is.read(reinterpret_cast<char*>(header.rep_), 8); } - - friend std::ostream& operator<<(std::ostream& os, const icmp_header& header) - { return os.write(reinterpret_cast<const char*>(header.rep_), 8); } - -private: - unsigned short decode(int a, int b) const - { return (rep_[a] << 8) + rep_[b]; } - - void encode(int a, int b, unsigned short n) - { - rep_[a] = static_cast<unsigned char>(n >> 8); - rep_[b] = static_cast<unsigned char>(n & 0xFF); - } - - unsigned char rep_[8]; -}; - -template <typename Iterator> -void compute_checksum(icmp_header& header, - Iterator body_begin, Iterator body_end) -{ - unsigned int sum = (header.type() << 8) + header.code() - + header.identifier() + header.sequence_number(); - - Iterator body_iter = body_begin; - while (body_iter != body_end) - { - sum += (static_cast<unsigned char>(*body_iter++) << 8); - if (body_iter != body_end) - sum += static_cast<unsigned char>(*body_iter++); - } - - sum = (sum >> 16) + (sum & 0xFFFF); - sum += (sum >> 16); - header.checksum(static_cast<unsigned short>(~sum)); -} - -#endif // ICMP_HEADER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/icmp/ipv4_header.hpp b/3rdparty/asio/src/examples/cpp03/icmp/ipv4_header.hpp deleted file mode 100644 index 6785fd74d6c..00000000000 --- a/3rdparty/asio/src/examples/cpp03/icmp/ipv4_header.hpp +++ /dev/null @@ -1,102 +0,0 @@ -// -// ipv4_header.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef IPV4_HEADER_HPP -#define IPV4_HEADER_HPP - -#include <algorithm> -#include <asio/ip/address_v4.hpp> - -// Packet header for IPv4. -// -// The wire format of an IPv4 header is: -// -// 0 8 16 31 -// +-------+-------+---------------+------------------------------+ --- -// | | | | | ^ -// |version|header | type of | total length in bytes | | -// | (4) | length| service | | | -// +-------+-------+---------------+-+-+-+------------------------+ | -// | | | | | | | -// | identification |0|D|M| fragment offset | | -// | | |F|F| | | -// +---------------+---------------+-+-+-+------------------------+ | -// | | | | | -// | time to live | protocol | header checksum | 20 bytes -// | | | | | -// +---------------+---------------+------------------------------+ | -// | | | -// | source IPv4 address | | -// | | | -// +--------------------------------------------------------------+ | -// | | | -// | destination IPv4 address | | -// | | v -// +--------------------------------------------------------------+ --- -// | | ^ -// | | | -// / options (if any) / 0 - 40 -// / / bytes -// | | | -// | | v -// +--------------------------------------------------------------+ --- - -class ipv4_header -{ -public: - ipv4_header() { std::fill(rep_, rep_ + sizeof(rep_), 0); } - - unsigned char version() const { return (rep_[0] >> 4) & 0xF; } - unsigned short header_length() const { return (rep_[0] & 0xF) * 4; } - unsigned char type_of_service() const { return rep_[1]; } - unsigned short total_length() const { return decode(2, 3); } - unsigned short identification() const { return decode(4, 5); } - bool dont_fragment() const { return (rep_[6] & 0x40) != 0; } - bool more_fragments() const { return (rep_[6] & 0x20) != 0; } - unsigned short fragment_offset() const { return decode(6, 7) & 0x1FFF; } - unsigned int time_to_live() const { return rep_[8]; } - unsigned char protocol() const { return rep_[9]; } - unsigned short header_checksum() const { return decode(10, 11); } - - asio::ip::address_v4 source_address() const - { - asio::ip::address_v4::bytes_type bytes - = { { rep_[12], rep_[13], rep_[14], rep_[15] } }; - return asio::ip::address_v4(bytes); - } - - asio::ip::address_v4 destination_address() const - { - asio::ip::address_v4::bytes_type bytes - = { { rep_[16], rep_[17], rep_[18], rep_[19] } }; - return asio::ip::address_v4(bytes); - } - - friend std::istream& operator>>(std::istream& is, ipv4_header& header) - { - is.read(reinterpret_cast<char*>(header.rep_), 20); - if (header.version() != 4) - is.setstate(std::ios::failbit); - std::streamsize options_length = header.header_length() - 20; - if (options_length < 0 || options_length > 40) - is.setstate(std::ios::failbit); - else - is.read(reinterpret_cast<char*>(header.rep_) + 20, options_length); - return is; - } - -private: - unsigned short decode(int a, int b) const - { return (rep_[a] << 8) + rep_[b]; } - - unsigned char rep_[60]; -}; - -#endif // IPV4_HEADER_HPP diff --git a/3rdparty/asio/src/examples/cpp03/icmp/ping.cpp b/3rdparty/asio/src/examples/cpp03/icmp/ping.cpp deleted file mode 100644 index 3a1d278415d..00000000000 --- a/3rdparty/asio/src/examples/cpp03/icmp/ping.cpp +++ /dev/null @@ -1,161 +0,0 @@ -// -// ping.cpp -// ~~~~~~~~ -// -// Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#include <asio.hpp> -#include <boost/bind.hpp> -#include <istream> -#include <iostream> -#include <ostream> - -#include "icmp_header.hpp" -#include "ipv4_header.hpp" - -using asio::ip::icmp; -using asio::deadline_timer; -namespace posix_time = boost::posix_time; - -class pinger -{ -public: - pinger(asio::io_context& io_context, const char* destination) - : resolver_(io_context), socket_(io_context, icmp::v4()), - timer_(io_context), sequence_number_(0), num_replies_(0) - { - destination_ = *resolver_.resolve(icmp::v4(), destination, "").begin(); - - start_send(); - start_receive(); - } - -private: - void start_send() - { - std::string body("\"Hello!\" from Asio ping."); - - // Create an ICMP header for an echo request. - icmp_header echo_request; - echo_request.type(icmp_header::echo_request); - echo_request.code(0); - echo_request.identifier(get_identifier()); - echo_request.sequence_number(++sequence_number_); - compute_checksum(echo_request, body.begin(), body.end()); - - // Encode the request packet. - asio::streambuf request_buffer; - std::ostream os(&request_buffer); - os << echo_request << body; - - // Send the request. - time_sent_ = posix_time::microsec_clock::universal_time(); - socket_.send_to(request_buffer.data(), destination_); - - // Wait up to five seconds for a reply. - num_replies_ = 0; - timer_.expires_at(time_sent_ + posix_time::seconds(5)); - timer_.async_wait(boost::bind(&pinger::handle_timeout, this)); - } - - void handle_timeout() - { - if (num_replies_ == 0) - std::cout << "Request timed out" << std::endl; - - // Requests must be sent no less than one second apart. - timer_.expires_at(time_sent_ + posix_time::seconds(1)); - timer_.async_wait(boost::bind(&pinger::start_send, this)); - } - - void start_receive() - { - // Discard any data already in the buffer. - reply_buffer_.consume(reply_buffer_.size()); - - // Wait for a reply. We prepare the buffer to receive up to 64KB. - socket_.async_receive(reply_buffer_.prepare(65536), - boost::bind(&pinger::handle_receive, this, _2)); - } - - void handle_receive(std::size_t length) - { - // The actual number of bytes received is committed to the buffer so that we - // can extract it using a std::istream object. - reply_buffer_.commit(length); - - // Decode the reply packet. - std::istream is(&reply_buffer_); - ipv4_header ipv4_hdr; - icmp_header icmp_hdr; - is >> ipv4_hdr >> icmp_hdr; - - // We can receive all ICMP packets received by the host, so we need to - // filter out only the echo replies that match the our identifier and - // expected sequence number. - if (is && icmp_hdr.type() == icmp_header::echo_reply - && icmp_hdr.identifier() == get_identifier() - && icmp_hdr.sequence_number() == sequence_number_) - { - // If this is the first reply, interrupt the five second timeout. - if (num_replies_++ == 0) - timer_.cancel(); - - // Print out some information about the reply packet. - posix_time::ptime now = posix_time::microsec_clock::universal_time(); - std::cout << length - ipv4_hdr.header_length() - << " bytes from " << ipv4_hdr.source_address() - << ": icmp_seq=" << icmp_hdr.sequence_number() - << ", ttl=" << ipv4_hdr.time_to_live() - << ", time=" << (now - time_sent_).total_milliseconds() << " ms" - << std::endl; - } - - start_receive(); - } - - static unsigned short get_identifier() - { -#if defined(ASIO_WINDOWS) - return static_cast<unsigned short>(::GetCurrentProcessId()); -#else - return static_cast<unsigned short>(::getpid()); -#endif - } - - icmp::resolver resolver_; - icmp::endpoint destination_; - icmp::socket socket_; - deadline_timer timer_; - unsigned short sequence_number_; - posix_time::ptime time_sent_; - asio::streambuf reply_buffer_; - std::size_t num_replies_; -}; - -int main(int argc, char* argv[]) -{ - try - { - if (argc != 2) - { - std::cerr << "Usage: ping <host>" << std::endl; -#if !defined(ASIO_WINDOWS) - std::cerr << "(You may need to run this program as root.)" << std::endl; -#endif - return 1; - } - - asio::io_context io_context; - pinger p(io_context, argv[1]); - io_context.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << std::endl; - } -} |