From 81b59a08b69d4872b06930aedd06a957c4acb7cc Mon Sep 17 00:00:00 2001 From: Aleksi Lindeman Date: Fri, 23 Nov 2018 15:44:08 +0100 Subject: Add data routing for failed p2p connections --- src/DirectConnection.cpp | 48 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 11 deletions(-) (limited to 'src/DirectConnection.cpp') diff --git a/src/DirectConnection.cpp b/src/DirectConnection.cpp index e5a997f..cb71c8f 100644 --- a/src/DirectConnection.cpp +++ b/src/DirectConnection.cpp @@ -156,27 +156,53 @@ namespace sibs connectCallbackFunc(peer, PubSubResult::RESULT_ERROR, e.what()); return PubSubConnectResult { peer, PubSubResult::RESULT_ERROR, e.what() }; } + + int socketId = socket->udtSocket; + if(!server) + { + UDT::epoll_add_usock(eid, socket->udtSocket); + socket->eid = eid; + peersMutex.lock(); + peers[socket->udtSocket] = peer; + peer->socket = std::move(socket); + peer->address = address; + peer->receiveDataCallbackFunc = receiveDataCallbackFunc; + peer->type = (server ? PeerType::SERVER : PeerType::CLIENT); + peer->routed = true; + peer->sharedKeys = 1; + peersMutex.unlock(); + } Log::debug("DirectConnections: Connecting to peer (ip: %s, port: %d, rendezvous: %s)", address.getAddress().c_str(), address.getPort(), rendezvous ? "yes" : "no"); - if(UDT::connect(socket->udtSocket, (sockaddr*)&address.address, sizeof(address.address)) == UDT::ERROR) + if(UDT::connect(socketId, (sockaddr*)&address.address, sizeof(address.address)) == UDT::ERROR) { + if(!server) + peers.erase(peers.find(socketId)); + if(connectCallbackFunc) connectCallbackFunc(peer, PubSubResult::RESULT_ERROR, UDT::getlasterror_desc()); + return PubSubConnectResult{ peer, PubSubResult::RESULT_ERROR, UDT::getlasterror_desc() }; } - - UDT::epoll_add_usock(eid, socket->udtSocket); - socket->eid = eid; - peersMutex.lock(); - peers[socket->udtSocket] = peer; - peer->socket = std::move(socket); - peer->address = address; - peer->receiveDataCallbackFunc = receiveDataCallbackFunc; - peer->type = (server ? PeerType::SERVER : PeerType::CLIENT); - peersMutex.unlock(); + + if(server) + { + UDT::epoll_add_usock(eid, socketId); + socket->eid = eid; + peersMutex.lock(); + peers[socketId] = peer; + peer->socket = std::move(socket); + peer->address = address; + peer->receiveDataCallbackFunc = receiveDataCallbackFunc; + peer->type = PeerType::SERVER; + peer->sharedKeys = 1; + peersMutex.unlock(); + } + peer->routed = false; if(connectCallbackFunc) connectCallbackFunc(peer, PubSubResult::RESULT_OK, ""); + return PubSubConnectResult { peer, PubSubResult::RESULT_OK, "" }; }); connectionResultsMutex.unlock(); -- cgit v1.2.3