aboutsummaryrefslogtreecommitdiff
path: root/src/BootstrapNode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/BootstrapNode.cpp')
-rw-r--r--src/BootstrapNode.cpp39
1 files changed, 38 insertions, 1 deletions
diff --git a/src/BootstrapNode.cpp b/src/BootstrapNode.cpp
index e26b9ea..fb10dcc 100644
--- a/src/BootstrapNode.cpp
+++ b/src/BootstrapNode.cpp
@@ -8,6 +8,8 @@
#include <ws2tcpip.h>
#endif
#include <udt/udt.h>
+#include <sibs/SafeSerializer.hpp>
+#include <sibs/SafeDeserializer.hpp>
namespace sibs
{
@@ -56,10 +58,45 @@ namespace sibs
UDT::epoll_add_usock(connections.eid, clientSocket);
std::shared_ptr<DirectConnectionPeer> peer = std::make_shared<DirectConnectionPeer>();
peer->socket = clientSocket;
- peer->receiveDataCallbackFunc = nullptr;
+ sockaddr_in *clientAddrSock = (sockaddr_in*)&clientAddr;
+ memcpy(&peer->address.address, clientAddrSock, sizeof(peer->address.address));
+ peer->receiveDataCallbackFunc = std::bind(&BootstrapNode::peerSubscribe, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
connections.peersMutex.lock();
connections.peers[clientSocket] = peer;
connections.peersMutex.unlock();
}
}
+
+ void BootstrapNode::peerSubscribe(std::shared_ptr<DirectConnectionPeer> newPeer, const void *data, const usize size)
+ {
+ sibs::SafeDeserializer deserializer((const u8*)data, size);
+ PubsubKey pubsubKey;
+ deserializer.extract(pubsubKey.data.data(), PUBSUB_KEY_LENGTH);
+
+ auto &peers = subscribedPeers[pubsubKey];
+ for(auto &peer : peers)
+ {
+ if(peer->address.address.sin_addr.s_addr == newPeer->address.address.sin_addr.s_addr)
+ return;
+ }
+
+ sibs::SafeSerializer serializer;
+ serializer.add(pubsubKey.data.data(), pubsubKey.data.size());
+ serializer.add((u32)newPeer->address.address.sin_family);
+ serializer.add((u32)newPeer->address.address.sin_addr.s_addr);
+ serializer.add((u16)newPeer->address.address.sin_port);
+ std::shared_ptr<std::vector<u8>> serializerData = std::make_shared<std::vector<u8>>(std::move(serializer.getBuffer()));
+
+ sibs::SafeSerializer newPeerSerializer;
+ newPeerSerializer.add(pubsubKey.data.data(), pubsubKey.data.size());
+ for(auto &peer : peers)
+ {
+ connections.send(peer, serializerData);
+ newPeerSerializer.add((u32)peer->address.address.sin_family);
+ newPeerSerializer.add((u32)peer->address.address.sin_addr.s_addr);
+ newPeerSerializer.add((u16)peer->address.address.sin_port);
+ }
+ peers.push_back(newPeer);
+ connections.send(newPeer, std::make_shared<std::vector<u8>>(std::move(newPeerSerializer.getBuffer())));
+ }
}