Example of blocking reads in accepted Sockets.
#include <sys/socket.h>
#include <memory>
#include <string>
#include <vector>
#include <thread>
#include <iostream>
class EchoHandler {
public:
EchoHandler(
Socket::Ptr theSocket,
const std::string& greeting)
: socket(theSocket)
{
try {
send(greeting);
send("Any line beginning with \"quit\" will terminate this echo client.\n");
} catch (...) {
}
}
void operator() () {
try {
while(true) {
if(readCurrent()) {
break;
}
}
} catch(...) {
}
}
private:
bool readCurrent() {
const int bufferLen = 1024;
char buffer[bufferLen];
const ssize_t readLength = socket->blockingReceive(buffer, bufferLen - 1);
if(0 == readLength) {
return false;
}
return actOn(std::string(buffer, readLength));
}
bool actOn(const std::string& buffer) {
if(0 == buffer.find("quit")) {
send("Goodbye!\n");
return true;
}
send(buffer);
return false;
}
void send(const std::string& message) {
socket->send(message.c_str(), message.length() + 1);
}
private:
static const int timeout_ms = 500;
};
class EchoServer {
public:
: serverSocket(ServerSocket::open(address))
{
}
void operator()() {
try {
while(true) {
acceptCurrent();
}
} catch(...) {
}
for(std::thread& acceptedThread : acceptedThreads) {
try {
acceptedThread.join();
} catch (...) {
}
}
}
private:
void acceptCurrent() {
const int id = acceptedThreads.size() + 1;
acceptedThreads.push_back(serverSocket->acceptInNewThread(
const std::string greeting = std::string("Welcome, Connection #") + std::to_string(id) + "\n";
EchoHandler e(accepted, greeting);
e();
}));
}
private:
static const int timeout_ms = 500;
std::vector<std::thread> acceptedThreads;
};
int main(int argc, char** argv) {
std::thread serverThread(
[=]() {
EchoServer server(addr);
server();
});
serverThread.join();
return 0;
}
std::shared_ptr< Address > Ptr
std::shared_ptr< InetAddress > Ptr
static int create(SocketType socketType, const std::string &serviceName, const std::string &address, std::vector< InetAddress::Ptr > &created, unsigned int max=0)
std::shared_ptr< ServerSocket > Ptr
std::shared_ptr< Socket > Ptr
Namespace of the BsdSockets library.