Skip to content

Commit 14750b9

Browse files
committed
Fixed server one-side message receiving and minor changes
Fixed formating of some info messages. Added server messaging on UDP-socket is sent wrong header. This is required when server closed UDP-session but client don't know that so it can receive wrong header or size and close session without waiting for timeout.
1 parent b22f637 commit 14750b9

File tree

3 files changed

+54
-34
lines changed

3 files changed

+54
-34
lines changed

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,6 @@
5757
"map": "cpp",
5858
"regex": "cpp",
5959
"shared_mutex": "cpp"
60-
}
60+
},
61+
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools"
6162
}

client/MainConsole.cpp

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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 = [&currentState, &currentSession](console_state newState)
66+
auto switchState = [&currentState, &currentSession, &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";

server/SessionUdp.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ namespace simpleApp
4848

4949
auto len = recvfrom(masterSocket, msgBuff, buffCheckLength, 0, (sockaddr *)&address, &addressLen);
5050

51+
auto sendInitError = [masterSocket, &address]()
52+
{
53+
const msg_headers buff = msg_headers::err_connstart;
54+
sendto(masterSocket, &buff, sizeof(buff), 0, (sockaddr *)&address, sizeof(address));
55+
};
56+
5157
if (len == -1)
5258
{
5359
return session_result(session_status::init_listener_fail, errno);
@@ -56,10 +62,16 @@ namespace simpleApp
5662
this->_name += std::string(" (") + addressToString(address) + std::string(")");
5763

5864
if (len != sizeof(msg_headers))
65+
{
66+
sendInitError();
5967
return session_result(session_status::init_udp_wrong_length);
60-
68+
}
69+
6170
if (*(reinterpret_cast<msg_headers *>(msgBuff)) != msg_headers::req_connstart)
71+
{
72+
sendInitError();
6273
return session_result(session_status::init_udp_wrong_header);
74+
}
6375

6476
auto initSocket = [this, &address]()
6577
{
@@ -160,8 +172,7 @@ namespace simpleApp
160172
}
161173
else
162174
{
163-
const uint8_t header = static_cast<const uint8_t>(msg_headers::err_connstart);
164-
sendto(masterSocket, &header, sizeof(header), 0, (sockaddr *)&address, sizeof(sockaddr_in));
175+
sendInitError();
165176
}
166177

167178
return result;

0 commit comments

Comments
 (0)