-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient.h
More file actions
167 lines (140 loc) · 4.83 KB
/
client.h
File metadata and controls
167 lines (140 loc) · 4.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#ifndef CLIENT_H
#define CLIENT_H
#include <string>
#include <boost/asio.hpp>
#include <boost/asio/steady_timer.hpp>
#include <boost/array.hpp>
#include <chrono>
#include "parser.h"
namespace asio = boost::asio;
/**
* Klasa reprezentująca klienta.
*/
class client {
private:
/**
* Parametry z treści.
*/
int retransmit_limit;
std::string port;
std::string server;
int max_raport_interval = 1000; //maksymalna tolerancja dla odstepu miedzy raportami
int connect_interval = 500; //czas dla timera (w milisekundach) do ponownego łączenia
int keepalive_interval = 100; //odstęp czasu dla timera do wysyłania KEEPALIVE
int nr_max_seen = 0;
const std::string KEEPALIVE;
static const char NEWLINE_SIGN = '\n';
static const int EOF_ERR_NO = 2; //boostowy error number
static const int BUF_SIZE = 1 << 16;
static const unsigned RETRANSMIT_MAX = 100;
//wartości do pamiętania
int my_nr_global = 0; //numer wczytanego datagramu
int server_nr_global = 0; //number wczytanego datagramu serwera
int win_global = 0; //liczba wolnych bajtów w kolejce
std::string last_sended_msg;
int data_counter = 0; //pomocnicza zmienna do sprawdzania, czy nie otzymalismy komunikatow data bez wczesniejszego ack
bool was_first_udp = false; //informacja o tym, czy otrzymalismy juz pierwszy datagram udp
bool is_reading = false; //flaga mówiąca o tym, czy zlecono asynchronicznie czytanie wejścia
/////////////////////////////////////////////////////////////////
//TCP
asio::ip::tcp::resolver resolver_tcp;
asio::ip::tcp::socket sock_tcp;
// boost::array<char, 4096> buffer;
boost::asio::streambuf stream_buffer_tcp;
asio::steady_timer connect_timer; //timer sprawdzający co jakiś czas stan połączenie tcp
///////////////////////////////////////////////////////////////
//UDP
asio::ip::udp::resolver resolver_udp;
asio::ip::udp::socket sock_udp;
asio::ip::udp::endpoint ep_udp;
asio::ip::udp::endpoint server_udp_endpoint;
boost::asio::streambuf stream_buffer_udp;
boost::array<char, BUF_SIZE> udp_receive_buffer;
asio::steady_timer keepalive_timer; //timer do wysyłania keepalive
////////////////////////////////////////////////////////////////////
//STDIN STDOUT
asio::posix::stream_descriptor std_input;
asio::posix::stream_descriptor std_output;
boost::array<char, BUF_SIZE> stdin_buf;
/////////////////////////////////////////////////////
std::chrono::system_clock::time_point last_server_msg; //czas ostatniej wiadomości od serwera
parser client_parser;
/**
* Obsługa zdarzenia odbioru wiadomości TCP.
*
* @param ec error code
* @param bytes_transferred liczba przesłanych bajtów
*/
void receive_tcp_handler(const boost::system::error_code &ec, std::size_t bytes_transferred);
/**
* Obsługa zdarzenia łączenia z serwerem po TCP.
*
* @param ec error code
*/
void connect_tcp_handler(const boost::system::error_code &ec);
/**
* Obsługa zdarzenia łączenia z serwerem po UDP.
*
* @param ec error code
*/
void receive_udp_handler(const boost::system::error_code &ec);
/**
* Tworzy i wysyła wiadomość UPLOAD do serwera.
*
* @param liczba danych otrzymanych z wejścia w bajtach
*/
void send_upload_message(std::size_t);
/**
* Obsługa zdarzenia otrzymania wiadomości DATA od serwera.
*
* @param nr
* @param ack
* @param win
* @param długość nagłówka
* @param liczba przesłanych bajtów
*/
void resolve_data_message(int, int, int, int, int);
/**
* Obsługa zdarzenia otrzymania wiadomości ACK od serwera.
*
* @param ack
* @param win
*/
void resolve_ack_message(int, int);
/**
* Nasłuchuje na komunikaty udp i odpowiednio nimi zarządza.
*/
void udp_listening();
/**
* Metoda do wywoływania timera wysyłające wiadomości KEEPALIVE.
*/
void run_keepalive_timer();
/**
* Ustawia i uruchamia timer sprawdzający stan połączenia.
*/
void run_connection_timer();
/**
* Uaktualnia czas otrzymania ostatniej wiadomości od serwera.
*/
void update_last_server_msg();
/**
* Ustawienia sieci.
*/
void setup_networking();
public:
client(asio::io_service&);
/**
* Metoda służąca do wykonania ustawień.
*
* @param retransmit_limit z treści
* @param port z treści
* @param server z treści
*/
void setup(int retransmit_limit, std::string port, std::string server);
class connection_exception : public std::exception {
const char* what() const noexcept {
return "Connection failed! Trying to reconnect...";
}
};
};
#endif /* CLIENT_H */