void AbstractTcpService::start()

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};
}