Skip to content

Commit 6533863

Browse files
author
Artiom N.
committed
OOB async server fixed
1 parent e7234b4 commit 6533863

File tree

1 file changed

+33
-22
lines changed

1 file changed

+33
-22
lines changed

src/book01/ch06/cpp/oob_example/oob_server_async.cpp

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,32 @@ void signal_handler(int signal)
3030
}
3131

3232

33+
void recv_data(
34+
const socket_wrapper::SocketWrapper &sock_wrap, const socket_wrapper::Socket &client_sock,
35+
std::array<char, buffer_size> &data_buff)
36+
{
37+
if (ssize_t n = recv(client_sock, data_buff.data(), data_buff.size(), 0); n < 0)
38+
{
39+
if (auto e_code = sock_wrap.get_last_error_code(); EINTR == e_code || EAGAIN == e_code)
40+
{
41+
std::cout << "recv was broken by signal!" << std::endl;
42+
}
43+
else
44+
throw std::system_error(e_code, std::system_category(), "recv data");
45+
}
46+
else if (!n)
47+
{
48+
std::cout << "No data, exiting..." << std::endl;
49+
exit(EXIT_SUCCESS);
50+
}
51+
else
52+
{
53+
std::cout << "Ordinary data received...\n"
54+
<< n << " bytes was read: " << std::string(data_buff.begin(), data_buff.begin() + n) << std::endl;
55+
}
56+
}
57+
58+
3359
int main(int argc, const char *const argv[])
3460
{
3561
if (argc != 2)
@@ -66,7 +92,11 @@ int main(int argc, const char *const argv[])
6692
throw std::system_error(sock_wrap.get_last_error_code(), std::system_category(), "sockatmark");
6793
break;
6894
case 1:
69-
if (!oob_flag) continue;
95+
if (!oob_flag)
96+
{
97+
recv_data(sock_wrap, client_sock, data_buff);
98+
continue;
99+
}
70100
std::cout << "OOB data received..." << std::endl;
71101
char oob_data;
72102
if (recv(client_sock, &oob_data, 1, MSG_OOB) < 0)
@@ -81,27 +111,8 @@ int main(int argc, const char *const argv[])
81111
oob_flag = false;
82112
break;
83113
case 0:
84-
if (ssize_t n = recv(client_sock, data_buff.data(), data_buff.size(), 0); n < 0)
85-
{
86-
auto e_code = sock_wrap.get_last_error_code();
87-
if (EINTR == e_code || EAGAIN == e_code)
88-
{
89-
std::cout << "recv was broken by signal!" << std::endl;
90-
continue;
91-
}
92-
throw std::system_error(e_code, std::system_category(), "recv data");
93-
}
94-
else if (!n)
95-
{
96-
std::cout << "No data, exiting..." << std::endl;
97-
exit(EXIT_SUCCESS);
98-
}
99-
else
100-
{
101-
std::cout << "Ordinary data received...\n"
102-
<< n << " bytes was read: " << std::string(data_buff.begin(), data_buff.begin() + n)
103-
<< std::endl;
104-
}
114+
std::cout << "sockatmark() is 0" << std::endl;
115+
recv_data(sock_wrap, client_sock, data_buff);
105116
break;
106117
default:
107118
throw std::runtime_error("unexpected sockatmark");

0 commit comments

Comments
 (0)