A wrapper for Linux eventfd.
Provides a signallable event counter, which is readable and writable across process boundaries.
TEST(inet_example, client_server_stream_test)
{
Logger log;
log.add_cout();
log.id("tcp client");
std::packaged_task<int(void)> serv_task([&addr, &listening]()
{
Logger log;
log.add_cout();
log.id("tcp server");
try
{
log << "server listening" << endl;
log << "signalling client" << endl;
auto conn =
sock.accept(from);
log << "connection from " << from << endl;
int count = 0;
for (string got; std::getline(stream, got);)
{
log << "got " << got << endl;
count += got.size();
stream << got << endl;
}
return count;
}
catch (exception& ex)
{
log << ex.what() << endl;
return -1;
}
});
auto fut = serv_task.get_future();
std::thread serv(std::move(serv_task));
Poller pin;
while (1)
{
pin.wait(std::chrono::milliseconds(700));
if (pin.event(listening))
{
break;
}
log << "waiting for listener" << endl;
}
error_code ec;
if (ec.value() != 0 && ec.value() != EINPROGRESS)
{
log << "Non blocking connect failed: " << ec.message() << endl;
ASSERT_EQ(ec.value(), 0);
}
log << "waiting for 200 ms seconds to connect" << endl;
Poller pout;
pout.wait(std::chrono::milliseconds(200));
if (!pout.event(sock))
{
log << "connect attempt timed out" << endl;
ASSERT_EQ(pout.event(sock), 0);
}
sock.non_blocking(
false);
log << "connected, sending stuff" << endl;
string line1("first line");
string line2("second line");
string got;
ASSERT_TRUE(stream << line1 << endl);
ASSERT_TRUE(getline(stream, got));
ASSERT_EQ(got, line1);
ASSERT_TRUE(stream << line2 << endl);
ASSERT_TRUE(getline(stream, got));
ASSERT_EQ(got, line2);
serv.join();
int res = fut.get();
log << "got result=" << res << endl;
ASSERT_EQ(res, line1.size()+line2.size());
}
unsigned port() const
Get the port.
virtual std::string host() const
Get host.
Internet transmission control protocol (tcp) socket.
Signaling kernel event counter.
uint64_t read()
Read from (decrement) the event counter.
void write(uint64_t)
Write to (increment) the event counter.
Input/output stream wrapper for reader/writer.
@ output
File descriptor is available for write operations.
@ input
File descriptor is available for read operations.
TEST(inet_example, client_server_stream_test)
[Inet client server]