@@ -60,15 +60,18 @@ namespace simpleApp
6060 bool isExit = false ;
6161 SessionClient * currentSession = nullptr ;
6262 console_state currentState;
63+
64+ socket_t sessionSocket = -1 ;
6365
64- auto switchState = [¤tState, ¤tSession](console_state newState)
66+ auto switchState = [¤tState, ¤tSession, &sessionSocket ](console_state newState)
6567 {
6668 switch (newState)
6769 {
6870 case console_state::protocol_selection:
6971 if (currentSession != nullptr )
7072 {
7173 delete currentSession;
74+ sessionSocket = -1 ;
7275 currentSession = nullptr ;
7376 }
7477 std::cout << std::endl << " Select protocol: [u]dp or [t]cp" << std::endl;
@@ -78,6 +81,7 @@ namespace simpleApp
7881 std::cout << std::endl << " Input server IP-address" << std::endl;
7982 break ;
8083 case console_state::connected:
84+ sessionSocket = currentSession->getSocket ();
8185 std::cout << std::endl << " Connected. Input message" << std::endl;
8286 break ;
8387 }
@@ -93,13 +97,13 @@ namespace simpleApp
9397 fd_set fd_in;
9498 FD_ZERO (&fd_in);
9599
96- FD_SET (this ->breakEventFd , &fd_in);
97100 FD_SET (STDIN_FILENO, &fd_in);
101+ FD_SET (this ->breakEventFd , &fd_in);
98102
99103 int largerFd = this ->breakEventFd > STDIN_FILENO ? this ->breakEventFd : STDIN_FILENO;
100- if (currentSession != nullptr )
104+ if (sessionSocket != - 1 )
101105 {
102- auto sessionSocket = currentSession-> getSocket ( );
106+ FD_SET ( sessionSocket, &fd_in );
103107 largerFd = sessionSocket > largerFd ? sessionSocket : largerFd;
104108 }
105109
@@ -118,6 +122,23 @@ namespace simpleApp
118122 return -1 ;
119123 }
120124
125+ if (FD_ISSET (this ->breakEventFd , &fd_in))
126+ {
127+ eventfd_t decrement = 1 ;
128+ eventfd_read (this ->breakEventFd , &decrement);
129+
130+ std::cout << std::endl;
131+
132+ if (currentState == console_state::protocol_selection)
133+ isExit = true ;
134+ else
135+ {
136+ switchState (console_state::protocol_selection);
137+ }
138+
139+ continue ;
140+ }
141+
121142 if (currentState == console_state::connected)
122143 {
123144 if (selectResult == 0 )
@@ -127,8 +148,12 @@ namespace simpleApp
127148 {
128149 if (result.status == session_status::connup_timeout)
129150 std::cout << std::endl << " Server does not response" ;
151+ else if (result.status == session_status::connup_timeout)
152+ std::cout << std::endl << " Server closed session due to timeout" ;
153+ else if (result.status == session_status::server_error)
154+ std::cout << std::endl << " Server returned internal error" ;
130155 else
131- std::cout << std::endl << " Unknown error " ;
156+ std::cout << std::endl << " Error. Unknown status returned " ;
132157
133158 if (result.err != 0 )
134159 std::cout << " with code " << result.err << std::endl << std::flush;
@@ -141,29 +166,29 @@ namespace simpleApp
141166 }
142167 }
143168
144- if (FD_ISSET (currentSession-> getSocket () , &fd_in))
169+ if (FD_ISSET (sessionSocket , &fd_in))
145170 {
146171 auto result = currentSession->proceed ();
147172
148173 switch (result.status )
149174 {
150175 case session_status::proceed_msg_recv_fail:
151- std::cout << " Message receiving failed" ;
176+ std::cout << std::endl << " Message receiving failed" ;
152177 break ;
153178 case session_status::proceed_disconnect:
154- std::cout << " Session shutdown by server" ;
179+ std::cout << std::endl << " Session closed by server" ;
155180 break ;
156181 case session_status::recv_wrong_length:
157- std::cout << " Message with wrong length received" ;
182+ std::cout << std::endl << " Message with wrong length received" ;
158183 break ;
159184 case session_status::proceed_server_error:
160- std::cout << " Server error returned" ;
185+ std::cout << std::endl << " Server error returned" ;
161186 break ;
162187 case session_status::proceed_server_timeout:
163- std::cout << " Received server timeout" ;
188+ std::cout << std::endl << " Received server timeout" ;
164189 break ;
165190 default :
166- std::cout << " Unknown error" ;
191+ std::cout << std::endl << " Unknown error" ;
167192 break ;
168193 }
169194
@@ -182,23 +207,6 @@ namespace simpleApp
182207 continue ;
183208 }
184209
185- if (FD_ISSET (this ->breakEventFd , &fd_in))
186- {
187- eventfd_t decrement = 1 ;
188- eventfd_read (this ->breakEventFd , &decrement);
189-
190- std::cout << std::endl;
191-
192- if (currentState == console_state::protocol_selection)
193- isExit = true ;
194- else
195- {
196- switchState (console_state::protocol_selection);
197- }
198-
199- continue ;
200- }
201-
202210 if (FD_ISSET (STDIN_FILENO, &fd_in))
203211 {
204212 std::string line;
@@ -260,7 +268,7 @@ namespace simpleApp
260268 break ;
261269 case session_status::recv_wrong_length:
262270 case session_status::recv_wrong_header:
263- std::cout << " Received message corrupted" ;
271+ std::cout << " Received message corrupted. Possible that client didn't receive session close message " ;
264272 break ;
265273 case session_status::server_error:
266274 std::cout << " Error on server-side" ;
0 commit comments