diff options
author | dec05eba <dec05eba@protonmail.com> | 2018-06-06 20:06:14 +0200 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2020-08-18 22:56:48 +0200 |
commit | ed71e8adf36e3d0c3f6f2b54794fe069091d3376 (patch) | |
tree | e42eb457ea930a67d4e7352672e5d68082f3a2b4 /src/BootstrapNode.cpp | |
parent | c10dbcb7b59a5187061b1dcd162e8120c89a5973 (diff) |
Add bootstrap class (server)
Diffstat (limited to 'src/BootstrapNode.cpp')
-rw-r--r-- | src/BootstrapNode.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
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 <arpa/inet.h> + #include <netdb.h> +#else + #include <winsock2.h> + #include <ws2tcpip.h> +#endif +#include <udt/udt.h> + +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<DirectConnectionPeer> peer = std::make_shared<DirectConnectionPeer>(); + peer->socket = clientSocket; + peer->receiveDataCallbackFunc = nullptr; + connections.peersMutex.lock(); + connections.peers[clientSocket] = peer; + connections.peersMutex.unlock(); + } + } +} |