Skip to content

Commit 6bbc5c8

Browse files
author
Artiom N.
committed
Synchronous OOB data example fixed
1 parent b1eb47f commit 6bbc5c8

File tree

1 file changed

+29
-20
lines changed

1 file changed

+29
-20
lines changed

src/book01/ch06/cpp/oob_example/oob_server.cpp

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,30 @@ extern "C"
2020
#include <vector>
2121

2222

23-
constexpr size_t clients_count = 10;
2423
constexpr size_t buffer_size = 255;
2524

25+
26+
void recv_data(
27+
const socket_wrapper::SocketWrapper &sock_wrap, const socket_wrapper::Socket &client_sock,
28+
std::array<char, buffer_size> &data_buff)
29+
{
30+
if (ssize_t n = recv(client_sock, data_buff.data(), data_buff.size(), 0); n < 0)
31+
{
32+
throw std::system_error(sock_wrap.get_last_error_code(), std::system_category(), "recv data");
33+
}
34+
else if (!n)
35+
{
36+
std::cout << "No data, exiting..." << std::endl;
37+
exit(EXIT_SUCCESS);
38+
}
39+
else
40+
{
41+
std::cout << "Ordinary data received...\n"
42+
<< n << " bytes was read: " << std::string(data_buff.begin(), data_buff.begin() + n) << std::endl;
43+
}
44+
}
45+
46+
2647
int main(int argc, const char *const argv[])
2748
{
2849
if (argc != 2)
@@ -45,15 +66,17 @@ int main(int argc, const char *const argv[])
4566

4667
while (true)
4768
{
48-
int at_mark = sockatmark(client_sock);
49-
50-
switch (at_mark)
69+
switch (sockatmark(client_sock))
5170
{
5271
case -1:
5372
throw std::system_error(errno, std::system_category(), "sockatmark");
5473
break;
5574
case 1:
56-
if (oob_printed) continue;
75+
if (oob_printed)
76+
{
77+
recv_data(sock_wrap, client_sock, data_buff);
78+
continue;
79+
}
5780
std::cout << "OOB data received..." << std::endl;
5881

5982
char oob_data;
@@ -65,21 +88,7 @@ int main(int argc, const char *const argv[])
6588
oob_printed = true;
6689
break;
6790
case 0:
68-
if (ssize_t n = recv(client_sock, data_buff.data(), data_buff.size(), 0); n < 0)
69-
{
70-
throw std::system_error(sock_wrap.get_last_error_code(), std::system_category(), "recv data");
71-
}
72-
else if (!n)
73-
{
74-
std::cout << "No data, exiting..." << std::endl;
75-
exit(EXIT_SUCCESS);
76-
}
77-
else
78-
{
79-
std::cout << "Ordinary data received...\n"
80-
<< n << " bytes was read: " << std::string(data_buff.begin(), data_buff.begin() + n)
81-
<< std::endl;
82-
}
91+
recv_data(sock_wrap, client_sock, data_buff);
8392
oob_printed = false;
8493
break;
8594
default:

0 commit comments

Comments
 (0)