plebble
client.h
Go to the documentation of this file.
1 /*
2 -------------------------------------------------------------------------------
3  PLEBBLE
4 -------------------------------------------------------------------------------
5  Copyright (C) 2019-2020 KATLAS Technology. (http://katlastechnology.com)
6  Copyright (C) 2017-2020 Marcos Mayorga. (mm@mm-studios.com)
7 
8  This file is part of our Plebble(R) Platform.
9 
10  The code below cannot be copied, used for any purpose other than the one
11  agreed and/or distributed without the express permission of
12  KATLAS Technology.
13 -------------------------------------------------------------------------------
14 
15 
16 */
17 #ifndef USGOV_dfd7f74406ecd7bf1a137eafe457ab52dcb9c50fe177017cc67b73de69834ecb
18 #define USGOV_dfd7f74406ecd7bf1a137eafe457ab52dcb9c50fe177017cc67b73de69834ecb
19 
21 #include <netinet/in.h>
22 #include <arpa/inet.h>
23 #include <string>
24 #include <vector>
25 #include <unordered_map>
26 #include <csignal>
27 #include <cassert>
28 #include <memory>
29 #include <atomic>
30 #include <iostream>
31 #include "datagram.h"
32 #include <us/gov/config.h>
33 #include <condition_variable>
34 #include "send_queue.h"
35 #include "busyled.h"
36 
37 namespace us { namespace gov {
38 namespace socket {
39  using namespace std;
40  using us::ko;
41 
42  struct server;
43 
44  struct client {
45 
47 
48  static const char *KO_7190,*KO_58961,*KO_60541,*KO_10100,*KO_20190,*KO_20191;
49 
54  };
55 
56  client();
57  client(int sock);
58  virtual ~client();
59  ko connect0(uint32_t host, uint16_t port, bool block);
60  ko connect0(const string& host, uint16_t port, bool block);
61  virtual void disconnect(uint16_t seq, const string& reason);
62  virtual pair<security_level_t,string> security_level() const { return make_pair(security_level_ok,""); }
63  inline bool connected() const { return sock!=-1 && !finished.load(); }
67  //virtual datagram* encrypt0(datagram&d) const;
68  virtual void on_connect(ko);
69  pair<ko,datagram*> recv4x(datagram*d); //used by manager clients
70  pair<ko,datagram*> recv6(); //used by auto responder
71  chrono::system_clock::time_point since;
72  chrono::system_clock::time_point activity_recv;
73  chrono::system_clock::time_point last_test_alive;
74  atomic<uint64_t> activity;
75  ko init_sock2(uint32_t host, uint16_t port, bool block);
76  void dump(const string& prefix, ostream& os) const;
77  virtual void dump_all(const string& prefix, ostream& os) const { dump(prefix, os); }
78  static uint32_t host2addr(const string& host);
79  static string age(uint64_t msts);
80  static string age(chrono::system_clock::time_point time);
81  string refdata() const;
82  static string ip4_decode(uint32_t addr);
83  static uint32_t ip4_encode(const string& addr);
84  static bool is_wan_ip(uint32_t);
85  static bool is_valid_ip(uint32_t);
86  string endpoint() const; //IP:PORT
87  static string endpoint(uint32_t addr, uint16_t port);
88  static string endpoint(const pair<uint32_t,uint16_t>& ip);
89  static pair<ko,pair<string,uint16_t>> parse_endpoint(const string& ipport);
90  virtual ko send1(datagram*);
93  // void add_finishing_reason(uint16_t seq, const string& reason);
94  void set_finished();
95  inline bool is_finished() const { return finished.load(); }
96 // inline const string& get_finished_reason() const { return finished_reason; }
97  void test_alive();
98  void ping();
99 
101  atomic<int> busyrecv{0};
102  static struct timeval timeout;
103  int sock;
104  uint32_t address;
105  uint16_t port;
106  atomic<int> sendref{0};
107  server* parent{nullptr}; //weak pointer
108  queue_t* sendq{nullptr}; //weak pointer
109 
111  atomic<bool> finished{false};
112 
113  #if CFG_COUNTERS==1
114  public:
115  struct counters_t {
116  uint32_t attempt_read_fragment{0};
117  uint32_t disconnection_wrong_read{0};
118  uint32_t unknown_hostname{0};
119  uint32_t connection_refused{0};
120  uint32_t busy_outbound_pipe{0};
121  void dump(ostream&os) const;
122  };
123  static counters_t counters;
124  #endif
125 
126  #if CFG_LOGS==1
127  public:
128  string logdir;
129  #endif
130  };
131 
132 }
133 }}
134 
135 #endif
136 
us::gov::socket::client::decrypt0
virtual pair< ko, datagram * > decrypt0(datagram *d) const
anonymous_namespace{daemon.cpp}::age
string age(chrono::system_clock::time_point time)
Definition: daemon.cpp:263
us::gov::socket::client::parse_endpoint
static pair< ko, pair< string, uint16_t > > parse_endpoint(const string &ipport)
us::gov::socket::client::finished_reason
pair< uint16_t, string > finished_reason
Definition: client.h:110
us::is_ko
static bool is_ko(const std::string &s)
Definition: ko.h:30
us::gov::socket::client::security_level
virtual pair< security_level_t, string > security_level() const
Definition: client.h:62
us::gov::socket::client::test_alive
void test_alive()
us::gov::socket::client::prepare_worker_recv
void prepare_worker_recv()
us::gov::socket::client::security_level_ok
@ security_level_ok
Definition: client.h:51
us::gov::socket::client::init_sock2
ko init_sock2(uint32_t host, uint16_t port, bool block)
us::gov::socket::client::connected
bool connected() const
Definition: client.h:63
us::gov::socket::client::age
static string age(chrono::system_clock::time_point time)
us::gov::socket::client.pair
Definition: client.cs:143
us::gov::socket::client
Definition: client.h:44
us.ko
Definition: ko.java:20
us::gov::socket::client::security_level_disconnect
@ security_level_disconnect
Definition: client.h:52
cfg0.h
protocol.h
us
Definition: daemon.h:22
us::gov::socket::client::endpoint
static string endpoint(const pair< uint32_t, uint16_t > &ip)
unlikely
#define unlikely(x)
Definition: likely.h:30
us::gov::socket::busyled_t
Definition: busyled.h:27
us::gov::socket::client::recv6
pair< ko, datagram * > recv6()
us::gov::socket::client::is_finished
bool is_finished() const
Definition: client.h:95
us::gov::socket::queue_t
Definition: send_queue.h:48
likely.h
us::gov::socket::client::security_level_t
security_level_t
Definition: client.h:50
us::gov::socket::client::encrypt0
virtual pair< ko, datagram * > encrypt0(datagram *d) const
us::gov::socket::client::dump
void dump(const string &prefix, ostream &os) const
us::gov::socket::client::client
client(int sock)
us::gov::socket::client::activity
atomic< uint64_t > activity
Definition: client.h:74
us::gov::socket::client::age
static string age(uint64_t msts)
us::gov::socket::client::busyled_recv
static busyled_t busyled_recv
Definition: client.h:100
us::gov::socket::client::ping
void ping()
us::gov::socket::datagram::dend
uint32_t dend
Definition: datagram.h:201
us::gov::socket::client::is_wan_ip
static bool is_wan_ip(uint32_t)
us::gov::socket::client::endpoint
static string endpoint(uint32_t addr, uint16_t port)
us::gov::socket::datagram
Definition: datagram.h:44
us::gov::socket::client::dump_all
virtual void dump_all(const string &prefix, ostream &os) const
Definition: client.h:77
us::gov::socket::client::~client
virtual ~client()
us::gov::socket::datagram::system_channel
static uint16_t system_channel
Definition: datagram.h:199
us::gov::socket::client::address
uint32_t address
Definition: client.h:104
us::gov::socket::client::port
uint16_t port
Definition: client.h:105
anonymous_namespace{client.cpp}::duration_str
string duration_str(chrono::milliseconds time)
Definition: client.cpp:459
us::gov::socket
Definition: busyled.h:23
us::gov::socket::client::worker_ended_recv
void worker_ended_recv()
us::gov::socket::client::on_connect
virtual void on_connect(ko)
us::gov::socket::client::refdata
string refdata() const
us::ko
const ko_t * ko
Definition: ko.h:27
us::gov::socket::datagram::decode_service
uint16_t decode_service() const
datagram.h
us::gov::socket::client::raddress
pair< uint32_t, uint16_t > raddress() const
us::gov::socket::client::set_finished
void set_finished()
us::gov::socket::client::connect0
ko connect0(const string &host, uint16_t port, bool block)
us::gov::io::cfg0::trim
static void trim(string &)
c
us::gov::socket::client c
Definition: client.cpp:45
us::gov::socket::server
Definition: server.h:45
c
Definition: client.cpp:417
us::ok
static constexpr ko ok
Definition: ko.h:28
us::gov::socket::client::sock
int sock
Definition: client.h:103
us::gov::socket::client::connect0
ko connect0(uint32_t host, uint16_t port, bool block)
us::gov::socket::client::activity_recv
chrono::system_clock::time_point activity_recv
Definition: client.h:72
likely
#define likely(x)
Definition: likely.h:29
symmetric_encryption.h
std
Definition: app.h:380
us::gov::socket::client::last_test_alive
chrono::system_clock::time_point last_test_alive
Definition: client.h:73
send_queue.h
stacktrace.h
us::gov::socket::client::security_level_ban
@ security_level_ban
Definition: client.h:53
us::gov::socket::client::send1
virtual ko send1(datagram *)
config.h
busyled.h
us::gov::socket::client::is_valid_ip
static bool is_valid_ip(uint32_t)
us::gov::socket::client::disconnect
virtual void disconnect(uint16_t seq, const string &reason)
us::gov::socket::client::recv4x
pair< ko, datagram * > recv4x(datagram *d)
us::gov::socket::client::KO_7190
static const char * KO_7190
Definition: client.h:48
us::gov::socket::client::client
client()
us::gov::socket::client::since
chrono::system_clock::time_point since
Definition: client.h:71
us::gov::socket::client::host2addr
static uint32_t host2addr(const string &host)
us::gov::socket::client::ip4_encode
static uint32_t ip4_encode(const string &addr)
server.h
gov.h
us::gov::socket::client::endpoint
string endpoint() const
client.h
log
#define log
Definition: gov.h:83
us::gov::socket::client::queue_t
us::gov::socket::send_queue_t queue_t
Definition: client.h:46
us::gov::socket::client::ip4_decode
static string ip4_decode(uint32_t addr)
anonymous_namespace{client.cpp}::tuple_for_each
void tuple_for_each(const Container &c, Fun fun)
Definition: client.cpp:454