Newer
Older
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
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
/**
* @brief The UDPProtocol class is a derived class of BaseReceiver and represents a UDP protocol receiver.
* check the Base_Receiver.h file for more information.
*/
namespace inaf::oasbo::Receivers {
class UDPProtocol: public BaseReceiver {
protected:
/**
* @brief Constructs a UDPProtocol object with the specified IP and port.
*
* @param ip The IP address to bind the UDP socket to.
* @param prt The port number to bind the UDP socket to.
*/
UDPProtocol(std::string ip, int prt);
/**
* @brief Constructs a UDPProtocol object with default IP and port.
*/
UDPProtocol();
int srv_sock; /**< The server socket descriptor. */
std::string ip { }; /**< The IP address to bind the UDP socket to. */
int port; /**< The port number to bind the UDP socket to. */
struct sockaddr_in cliaddr; /**< The client address structure. */
struct sockaddr_in srvaddr; /**< The server address structure. */
bool checkIncomingPackets = true; /**< Flag that tells if it has to check for incoming udp packets. Set to false when calling closeConnectionToClient.
* Used to avoid the infinite loop in receiveAtLeastNbytes.
*/
/**
* @brief Splits the IP and port from the given IP:port string.
*
* @param ip_port The IP:port string to split.
* @param ip The extracted IP address.
* @param port The extracted port number.
* @return true if the IP and port were successfully extracted, false otherwise.
*/
bool split_ip_port(const std::string &ip_port, std::string &ip, int &port);
/**
* @brief Receives at least the specified number of bytes from the client.
* Helper function to receive at least the header of the packet.
* @param buff The buffer to store the received data.
* @param n_bytes The number of bytes to receive.
* @param max_size The max size of bytes to receive.
* @return The number of bytes received.
*/
int receiveAtLeastNbytes(uint8_t *buff, int n_bytes, int max_size);
/**
* @brief Resets the packet object and sets the number of bytes received.
*
* @param packet The packet object to reset.
* @param bytes The number of bytes received.
*/
void resetPacket(PacketLib::BasePacket& packet, int bytes);
public:
/**
* @brief Destroys the UDPProtocol object.
*/
~UDPProtocol();
/**
* @brief Gets the host name or IP address that the UDP socket is bound to.
*
* @return The host name or IP address.
*/
std::string getHost() override;
/**
* @brief Sets the host name or IP address to bind the UDP socket to.
*
* @param host The host name or IP address.
*/
void setHost(std::string host) override;
/**
* @brief Sets the IP address to bind the UDP socket to.
*
* @param ip The IP address.
*/
void setIp(std::string ip);
/**
* @brief Gets the IP address that the UDP socket is bound to.
*
* @return The IP address.
*/
std::string getIp(){return this->ip;}
/**
* @brief Sets the port number to bind the UDP socket to.
*
* @param port The port number.
*/
void setPort(int port);
/**
* @brief Gets the port number that the UDP socket is bound to.
*
* @return The port number.
*/
int getPort(){return this->port;}
/**
* @brief Connects to the client.
*
* @return 0 if the connection is successful, -1 otherwise.
*/
int connectToClient() override;
/**
* @brief Closes the connection to the client.
*
* @return 0 if the connection is closed successfully, -1 otherwise.
*/
int closeConnectionToClient() override;
/**
* @brief Checks if the UDP socket is connected to the client.
*
* @return true if the UDP socket is connected to the client, false otherwise.
*/
bool isConnectedToClient() const override;
/**
* @brief Receives a packet from the client.
*
* @param packet The packet object to store the received data.
* @return The number of bytes received.
*/
int receiveFromClient(PacketLib::BasePacket& packet) override;
friend class UDPProtocolBuilder;
};
class UDPProtocolBuilder {
protected:
UDPProtocol *protocol; /**< The UDPProtocol object being built. */
public:
std::string config_target {"udpreceiver"}; /**< The configuration target. */
std::string ip_key { "ip" }; /**< The configuration key for IP address. */
std::string port_key { "port" }; /**< The configuration key for port number. */
/**
* @brief Constructs a UDPProtocolBuilder object.
*/
UDPProtocolBuilder();
/**
* @brief Constructs a UDPProtocolBuilder object with the specified IP and port.
*
* @param ip The IP address to bind the UDP socket to.
* @param port The port number to bind the UDP socket to.
*/
UDPProtocolBuilder(std::string ip, int port);
/**
* @brief Destroys the UDPProtocolBuilder object.
*/
~UDPProtocolBuilder();
/**
* @brief Resets the UDPProtocolBuilder object.
*/
void reset();
/**
* @brief Configures the UDPProtocolBuilder object from a configurator.
*
* @param conf The configurator object.
* @return A pointer to the UDPProtocolBuilder object.
*/
UDPProtocolBuilder* configFrom(Configurators::BaseConfigurator &conf);
/**
* @brief Sets the IP address to bind the UDP socket to.
*
* @param ip The IP address.
* @return A pointer to the UDPProtocolBuilder object.
*/
UDPProtocolBuilder* setIp(std::string ip);
/**
* @brief Sets the port number to bind the UDP socket to.
*
* @param port The port number.
* @return A pointer to the UDPProtocolBuilder object.
*/
UDPProtocolBuilder* setPort(int port);
/**
* @brief Gets the UDPProtocol object that has been built.
*
* @return A pointer to the UDPProtocol object.
*/
UDPProtocol* getReceiver();
};
}
UDPProtocol(std::string ip, int prt);
UDPProtocol();
struct sockaddr_in cliaddr;
struct sockaddr_in srvaddr;
bool split_ip_port(const std::string &ip_port, std::string &ip,
int receiveAtLeastHeaderSizeBytes(uint8_t *buff, int headerSize,
int packetSize);
void resetPacket(PacketLib::BasePacket&, int bytes);
std::string getHost() override;
void setHost(std::string host) override;
void setIp(std::string);
std::string getIp(){return this->ip;}
void setPort(int);
int getPort(){return this->port;}
int connectToClient() override;
int closeConnectionToClient() override;
bool isConnectedToClient() const override;
class UDPProtocolBuilder {
protected:
UDPProtocol *protocol;
public:
std::string ip_key { "ip" };
std::string port_key { "port" };
UDPProtocolBuilder();
UDPProtocolBuilder(std::string ip, int port);
~UDPProtocolBuilder();
UDPProtocolBuilder* configFrom(Configurators::BaseConfigurator &conf);