aboutsummaryrefslogtreecommitdiff
path: root/src/BootstrapNode.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2018-06-06 20:06:14 +0200
committerdec05eba <dec05eba@protonmail.com>2020-08-18 22:56:48 +0200
commited71e8adf36e3d0c3f6f2b54794fe069091d3376 (patch)
treee42eb457ea930a67d4e7352672e5d68082f3a2b4 /src/BootstrapNode.cpp
parentc10dbcb7b59a5187061b1dcd162e8120c89a5973 (diff)
Add bootstrap class (server)
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();
+ }
+ }
+}