-
Notifications
You must be signed in to change notification settings - Fork 1
/
GSocket.h
executable file
·181 lines (153 loc) · 6.76 KB
/
GSocket.h
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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/*
* File: GSocket.h
* Author: gedas
*
* Created on Sekmadienis, 2016, kovas 27, 04.51
*/
#ifndef GSOCKET_H
#define GSOCKET_H
#include <vector>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <cerrno>
#include "GObject.h"
#include "GConfig.h"
#include "GCommandExecution.h"
namespace GServer {
class GCommandExecution;
class GSocket : public GObject {
public:
// ##### Kintamieji #####
// ##### END Kintamieji #####
// #####################################################################
// ##### Metodai #####
GSocket(GConfig* conf, GLogger* logger, GCommandExecution* command);
virtual ~GSocket();
/** close **
* Metodas skirtas baigti darbui su socketu */
virtual void close();
/** sendData **
* Meotdas skirtas issiuti duomenis i tinkla per si socketa. Sia
* funkcija turi igyvendinti kiekvienas protokolas savaip. Rezultatas-
* issiustu duomenu kiekis.
* socketFd- socketo i kuri siusi nuemris
data- suformuoti duomenys, kurie bus issiunciami*/
virtual int sendData(char * data, int size);
/** recive **
* Metodas skirtas gauti duomenis is tinklo. Sia funkcija turi
* igyvendinti kiekvienas protokolas savaitp. Rezultatas- gautu
* duomenu kiekis */
virtual int reciveData();
/** reciveData **
* Metodas skirtas gauti duomenis is tinklo. Rezultatas- gautu duomenu
* kiekis.
buffer- nuoroda i buferi kuri gauti
size- nurodoma kiek duomenu gauti*/
virtual int reciveData( char* buffer, int size );
/** getSocket**
* Metodas skirtas grazinti soketo numeriui */
int getSocket();
/** acceptConnection **
* Metodas skirtas priimti kliento prisjugimui. Metodas grazina naujai
* sukurti kliento objekta
* conf- objektas dirbantis su nustatymu failu
* maxDescriptor- maksimalaus deskritporiaus reiksme */
virtual GServer::GSocket* acceptConnection(GServer::GConfig* conf,
int &maxDescriptor);
// ##### END Metodai #####
protected:
// ##### Kintamieji #####
/** buffer **
* Kintamasis skirtas saugoti gaunama ir siunciama informacija i tinkla.
* Maksimalu buferio dydi nusako nustatymu faile saugoma reiksme
* MAX_SCOKET_BUFFER_SIZE */
std::vector<char> buffer;
/** socket_descriptor **
* Kintamasis skirtas saugoti failo deskriptoriaus numeri, kuris
* naudojamas bendrvmui su tinklo klientu. Numatyta reiksme- -1.
* Placiau- https://en.wikipedia.org/wiki/File_descriptor */
int socket_descriptor;
/** logger
* Kintamasis saugantis nuoroda i pranesimu rasimo objekta */
GLogger* logger;
/** remoteAddress **
* Struktura, skirta saugoti priimamo kliento duomenims, kaip IP ir
* PORT */
sockaddr_storage remoteAddress;
/** remoteAddressSize **
* Kintamasis saugantis remoteAddress strukturos dydi */
socklen_t remoteAddressSize;
/** skaitomiSocket**
* Kintamasis skirtas saugoti visu skaitomu socketu saraso nuoroda */
fd_set* skaitomiSocket;
/*** commands ***
* Kintamasis skirtas saugoti nuoroda i komandu apdorojimo objekta */
GCommandExecution* commands;
// ##### END Kintamieji #####
// #####################################################################
// ##### Metodai #####
/** createSocket **
* Metodas skirtas sukurti sistemos resursaui- socket. Si metoda
* realizuoja kiekviena vaiko klase atskirai.
socketFamily- kokio tipo tinklu bus bendraujama
socketType- kokiu principu bus bendraujama
socketProtocol- kokiu protokolu bus bendraujama
socketFlag- papildomi socket nustatymai
result - kintamsis saugnatis gautus rezultatus is IP ir PORT
* kombinacijos
Placiau: https://msdn.microsoft.com/en-us/library/windows/desktop/ms737530(v=vs.85).aspx*/
virtual int createSocket(char* ip, char* port, int socketFamily,
int socketType, int socketProtocol, int socketFlag,
addrinfo *& result);
/** createServerScoket **
* Metodas skirtas sukurti serverio socketa, kuris sukuria socketa,
* paruposia ji klausimuisi ir pradeda klausytis jungciu
socketFamily- kokio tipo tinklu bus bendraujama
socketType- kokiu principu bus bendraujama
socketProtocol- kokiu protokolu bus bendraujama
socketFlag- papildomi socket nustatymai
*/
virtual int createServerScoket(char* ip, char* port, int socketFamily,
int socketType, int socketProtocol, int socketFlag);
/** resizeBuffer **
* Metodas skirtas pertvarkyti buferio dydi i nurodyta. Buferis negali
* buti didesnes reiksmes nei nurodyta konfiguracinaime faile. Metodo
* rezultatas- naujas pertvarkytas dydis.
newSize- naujas pageidaujamas buferio dydis*/
int resizeBuffer(int newSize);
/** checkMaxDescriptor **
* Metodas skirtas nustatyti ar esamas deskriuptorius yra didenis nei
* dabartinis didenis deskritprius */
void checkMaxDescriptor(int& maxDescriptor);
/** acceptConnectionDescriptor **
* Metodas skirtas priimti naujo sujungimo deskriptoriui ir ji grazinti.
* Rezultatas- naujos jungties deskriptrius */
virtual int acceptConnectionDescriptor();
/** listen **
* Metodas sksirtas pradeti klausimuisi klientu prisjungimu nurodytu
* prievadu. Placiau: http://linux.die.net/man/2/listen*/
virtual void listenSocket();
// ##### END Metodai #####
private:
// ##### Kintamieji #####
/** MAX_BUFFER_SIZE **
* Konstanta nurodanti koks maksimalus gali buti buferio dydis */
const int MAX_BUFFER_SIZE;
// ##### END Kintamieji #####
// #####################################################################
// ##### Metodai #####
/** setSize **
* Metodas skirtas nustatyti buferio dydziui. Grazinama reiksme-
* naujas buferio dydis.
newSize- naujas pageidaujamas buferio dydis*/
int setBufferSize(int newSize);
/** bind **
Metodas skirtas socketo paruosimui klausimuisi
result- kintamsis saugnatis gautus rezultatus is IP ir PORT
* kombinacijos. Placiau: http://linux.die.net/man/2/bind*/
void bindSocket(addrinfo * result);
// ##### END Metodai #####
};
}
#endif /* GSOCKET_H */