source: nscp/include/nrpe/client/socket.hpp @ 294b37b

0.4.00.4.10.4.2
Last change on this file since 294b37b was 294b37b, checked in by Michael Medin <michael@…>, 3 years ago

Added ssl support (almost, still has hard coded certificate).
ported checksystem to work under the new environment
Added back performance data

  • Property mode set to 100644
File size: 3.5 KB
Line 
1#pragma once
2
3#include <boost/shared_ptr.hpp>
4
5#include <socket_helpers.hpp>
6#include <nsca/nsca_packet.hpp>
7
8using boost::asio::ip::tcp;
9
10namespace nrpe {
11        namespace client {
12
13        class socket : public boost::noncopyable {
14        private:
15                boost::shared_ptr<tcp::socket> socket_;
16        public:
17                typedef boost::asio::basic_socket<tcp,boost::asio::stream_socket_service<tcp> >  basic_socket_type;
18
19        public:
20                socket(boost::asio::io_service &io_service, std::wstring host, int port) {
21                        socket_.reset(new tcp::socket(io_service));
22                }
23                socket() {}
24
25                virtual boost::asio::io_service& get_io_service() {
26                        return socket_->get_io_service();
27                }
28                virtual basic_socket_type& get_socket() {
29                        return *socket_;
30                }
31
32                virtual void connect(std::wstring host, int port) {
33                        tcp::resolver resolver(get_io_service());
34                        tcp::resolver::query query(to_string(host), to_string(port));
35                        //tcp::resolver::query query("www.medin.name", "80");
36                        //tcp::resolver::query query("test_server", "80");
37
38                        tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
39                        tcp::resolver::iterator end;
40
41                        boost::system::error_code error = boost::asio::error::host_not_found;
42                        while (error && endpoint_iterator != end) {
43                                tcp::resolver::endpoint_type ep = *endpoint_iterator;
44                                get_socket().close();
45                                get_socket().lowest_layer().connect(*endpoint_iterator++, error);
46                        }
47                        if (error)
48                                throw boost::system::system_error(error);
49                }
50
51                ~socket() {
52                        get_socket().close();
53                }
54
55                virtual void send(nrpe::packet &packet, boost::posix_time::seconds timeout) {
56                        std::vector<char> buf = packet.get_buffer();
57                        write_with_timeout(buf, timeout);
58                }
59                virtual nrpe::packet recv(const nrpe::packet &packet, boost::posix_time::seconds timeout) {
60                        std::vector<char> buf(packet.get_packet_length());
61                        read_with_timeout(buf, timeout);
62                        return nrpe::packet(&buf[0], buf.size(), packet.get_payload_length());
63                }
64                virtual void read_with_timeout(std::vector<char> &buf, boost::posix_time::seconds timeout) {
65                        socketHelpers::io::read_with_timeout(*socket_, get_socket(), boost::asio::buffer(buf), timeout);
66                }
67                virtual void write_with_timeout(std::vector<char> &buf, boost::posix_time::seconds timeout) {
68                        socketHelpers::io::write_with_timeout(*socket_, get_socket(), boost::asio::buffer(buf), timeout);
69                }
70        };
71
72
73
74#ifdef USE_SSL
75        class ssl_socket : public socket {
76        private:
77                boost::shared_ptr<boost::asio::ssl::stream<tcp::socket> > ssl_socket_;
78
79        public:
80                ssl_socket(boost::asio::io_service &io_service, boost::asio::ssl::context &ctx, std::wstring host, int port) : socket() {
81                        ssl_socket_.reset(new boost::asio::ssl::stream<tcp::socket>(io_service, ctx));
82                }
83
84                virtual void connect(std::wstring host, int port) {
85                        socket::connect(host, port);
86                        ssl_socket_->handshake(boost::asio::ssl::stream_base::client);
87                }
88
89                virtual boost::asio::io_service& get_io_service() {
90                        return ssl_socket_->get_io_service();
91                }
92                virtual basic_socket_type& get_socket() {
93                        return ssl_socket_->lowest_layer();
94                }
95
96                virtual void write_with_timeout(std::vector<char> &buf, boost::posix_time::seconds timeout) {
97                        socketHelpers::io::write_with_timeout(*ssl_socket_, get_socket(), boost::asio::buffer(buf), timeout);
98                }
99
100                virtual void read_with_timeout(std::vector<char> &buf, boost::posix_time::seconds timeout) {
101                        socketHelpers::io::read_with_timeout(*ssl_socket_, get_socket(), boost::asio::buffer(buf), timeout);
102                }
103        };
104#endif
105}
106}
Note: See TracBrowser for help on using the repository browser.