in analyzers/src/json/abstract_tcp_service.cpp [58:90]
void AbstractTcpService::start()
{
_isRunning = true;
// Setting up server TCP-socket
_serverSocket = socket(PF_INET, SOCK_STREAM, 0);
if(_serverSocket < 0)
{
throw std::system_error{errno, std::system_category(), "Opening server socket error"};
}
// Setting SO_REUSEADDR to true
int reuseAddr = 1;
if(setsockopt(_serverSocket, SOL_SOCKET, SO_REUSEADDR, &reuseAddr, sizeof(reuseAddr)) < 0)
{
throw std::system_error{errno, std::system_category(), "Setting SO_REUSEADDR socket option error"};
}
// Binding server socket to endpoint
IpEndpoint endpoint{_host.c_str(), _port};
if(bind(_serverSocket, endpoint.addrinfo()->ai_addr, endpoint.addrinfo()->ai_addrlen) != 0)
{
throw std::system_error{errno, std::system_category(), "Binding server socket error"};
}
// Converting socket to listening state
if(listen(_serverSocket, _backlog) != 0)
{
throw std::system_error{errno, std::system_category(), "Converting socket to listening state error"};
}
// Creating threads for thread-pool
for(auto& thr : _threadPool)
{
thr = std::thread{&AbstractTcpService::runWorker, this};
}
_listenerThread = std::thread{&AbstractTcpService::runListener, this};
}