Skip to content

Commit ffbf60a

Browse files
committed
Continue of client main loop implementation.
1 parent 0847c0f commit ffbf60a

File tree

4 files changed

+138
-5
lines changed

4 files changed

+138
-5
lines changed

client/MainConsole.cpp

Lines changed: 111 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include <sys/eventfd.h>
66
#include <sys/select.h>
7+
#include <arpa/inet.h>
78

89
#include <errno.h>
910
#include <unistd.h>
@@ -173,7 +174,116 @@ namespace simpleApp
173174

174175
if (FD_ISSET(STDIN_FILENO, &fd_in))
175176
{
176-
// TODO
177+
char buffer[MESSAGE_MAX_BUFFER - sizeof(msg_headers)];
178+
179+
int len = 0;
180+
// TODO read from stdin
181+
// len = read(stdin, buffer);
182+
183+
if (len == 0)
184+
{
185+
std::cout << " >> " << std::flush;
186+
}
187+
else if (currentState == console_state::protocol_selection)
188+
{
189+
if (len != 1 || (buffer[0] != 'u' && buffer[0] != 't'))
190+
{
191+
std::cout << "Invalid input. [u]dp or [t]cp?" << std::endl <<
192+
" >> " << std::flush;
193+
}
194+
else
195+
{
196+
if (buffer[0] == 'u')
197+
currentSession = new SessionTcp();
198+
else
199+
currentSession = new SessionUdp();
200+
201+
switchState(console_state::address_input);
202+
}
203+
}
204+
else if (currentState == console_state::address_input)
205+
{
206+
auto address = inet_addr(buffer);
207+
208+
if (address == INADDR_NONE)
209+
{
210+
std::cout << "The entered IP address is incorrect. Try again" << std::endl
211+
<< " >> " << std::flush;
212+
}
213+
else
214+
{
215+
auto result = currentSession->init(address);
216+
if (result.status == session_status::init_success)
217+
{
218+
switchState(console_state::connected);
219+
}
220+
else
221+
{
222+
switch(result.status)
223+
{
224+
case session_status::init_socket_fail:
225+
std::cout << "Socket initialization failed";
226+
break;
227+
case session_status::init_connection_fail:
228+
std::cout << "Connection failed";
229+
break;
230+
case session_status::init_udp_send_up_fail:
231+
case session_status::init_udp_recv_up_fail:
232+
std::cout << "Connection request failed";
233+
break;
234+
case session_status::recv_wrong_length:
235+
case session_status::recv_wrong_header:
236+
std::cout << "Received message corrupted";
237+
break;
238+
default:
239+
std::cout << "Unknown error";
240+
break;
241+
}
242+
243+
if (result.err != 0)
244+
std::cout << " with code " << result.err << std::endl << std::flush;
245+
else
246+
std::cout << std::endl << std::flush;
247+
248+
switchState(console_state::protocol_selection);
249+
}
250+
}
251+
}
252+
else if (currentState == console_state::connected)
253+
{
254+
auto result = currentSession->proceed(buffer, len);
255+
if (result.status == session_status::proceed_msg)
256+
{
257+
std::cout << "Received answer: '" << result.recvMsg << "'" << std::endl <<
258+
" >> " << std::flush;
259+
}
260+
else
261+
{
262+
switch(result.status)
263+
{
264+
case session_status::proceed_msg_send_fail:
265+
std::cout << "Message sending failed";
266+
break;
267+
case session_status::proceed_msg_recv_fail:
268+
std::cout << "Message receiving failed";
269+
break;
270+
case session_status::recv_wrong_length:
271+
case session_status::recv_wrong_header:
272+
std::cout << "Message has been corrupted";
273+
break;
274+
default:
275+
std::cout << "Unknown error";
276+
break;
277+
}
278+
279+
if (result.err != 0)
280+
std::cout << " with code " << result.err << std::endl << std::flush;
281+
else
282+
std::cout << std::endl << std::flush;
283+
284+
switchState(console_state::protocol_selection);
285+
}
286+
}
177287
}
178288
}
179289

client/SessionClient.cpp

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,32 @@ namespace simpleApp
8989
}
9090
else if (sendMsg != nullptr && msgSize != 0)
9191
{
92-
// TODO
93-
return session_status();
92+
if (this->sendMessage(msg_headers::client_msg, sendMsg, msgSize) == -1)
93+
{
94+
return session_result(session_status::proceed_msg_send_fail, errno);
95+
}
96+
97+
uint8_t buffer[MESSAGE_MAX_BUFFER];
98+
auto len = recv(this->_socket, buffer, MESSAGE_MAX_BUFFER, MSG_NOSIGNAL);
99+
100+
if (len == -1)
101+
{
102+
return session_result(session_status::proceed_msg_recv_fail);
103+
}
104+
else if (static_cast<size_t>(len) <= sizeof(msg_headers))
105+
{
106+
return session_result(session_status::recv_wrong_length);
107+
}
108+
109+
msg_headers header = *reinterpret_cast<msg_headers*>(buffer);
110+
111+
if (header != msg_headers::server_msg)
112+
{
113+
return session_result(session_status::recv_wrong_header);
114+
}
115+
116+
return session_result(
117+
std::string((char *)(buffer + sizeof(msg_headers)), len - sizeof(msg_headers)));
94118
}
95119
else
96120
{

client/SessionUdp.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ namespace simpleApp
4242

4343
if (len == -1)
4444
{
45-
auto result = session_result(session_status::init_connection_fail, errno);
45+
auto result = session_result(session_status::init_udp_recv_up_fail, errno);
4646
this->sessionClose();
4747
return result;
4848
}

client/console_state.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ namespace simpleApp
44
{
55
enum class console_state
66
{
7-
none,
87
protocol_selection,
98
address_input,
109
connected

0 commit comments

Comments
 (0)