aboutsummaryrefslogtreecommitdiff
path: root/src/BootstrapNode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/BootstrapNode.cpp')
-rw-r--r--src/BootstrapNode.cpp65
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();
+ }
+ }
+}