From ed71e8adf36e3d0c3f6f2b54794fe069091d3376 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Wed, 6 Jun 2018 20:06:14 +0200 Subject: Add bootstrap class (server) --- src/BootstrapNode.cpp | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/BootstrapNode.cpp (limited to 'src/BootstrapNode.cpp') diff --git a/src/BootstrapNode.cpp b/src/BootstrapNode.cpp new file mode 100644 index 0000000..e26b9ea --- /dev/null +++ b/src/BootstrapNode.cpp @@ -0,0 +1,65 @@ +#include "../include/sibs/BootstrapNode.hpp" +#include "../include/Log.hpp" +#ifndef WIN32 + #include + #include +#else + #include + #include +#endif +#include + +namespace sibs +{ + BootstrapNode::BootstrapNode(const Ipv4 &address) : + socket(connections.createSocket(address, false, true)) + { + if(UDT::listen(socket, 10) == UDT::ERROR) + { + std::string errMsg = "UDT: Failed to listen, error: "; + errMsg += UDT::getlasterror_desc(); + throw BootstrapException(errMsg); + } + acceptConnectionsThread = std::thread(&BootstrapNode::acceptConnections, this); + } + + BootstrapNode::~BootstrapNode() + { + connections.alive = false; + UDT::close(socket); + acceptConnectionsThread.join(); + } + + void BootstrapNode::acceptConnections() + { + sockaddr_storage clientAddr; + int addrLen = sizeof(clientAddr); + + while(connections.alive) + { + UDTSOCKET clientSocket = UDT::accept(socket, (sockaddr*)&clientAddr, &addrLen); + if(clientSocket == UDT::INVALID_SOCK) + { + // Connection was killed because bootstrap node was taken down + if(!connections.alive) + return; + Log::error("UDT: Failed to accept connection, error: %s", UDT::getlasterror_desc()); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + continue; + } + + char clientHost[NI_MAXHOST]; + char clientService[NI_MAXSERV]; + getnameinfo((sockaddr *)&clientAddr, addrLen, clientHost, sizeof(clientHost), clientService, sizeof(clientService), NI_NUMERICHOST | NI_NUMERICSERV); + Log::debug("UDT: New connection: %s:%s", clientHost, clientService); + + UDT::epoll_add_usock(connections.eid, clientSocket); + std::shared_ptr peer = std::make_shared(); + peer->socket = clientSocket; + peer->receiveDataCallbackFunc = nullptr; + connections.peersMutex.lock(); + connections.peers[clientSocket] = peer; + connections.peersMutex.unlock(); + } + } +} -- cgit v1.2.3