diff options
Diffstat (limited to 'src/DirectConnection.cpp')
-rw-r--r-- | src/DirectConnection.cpp | 48 |
1 files changed, 37 insertions, 11 deletions
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(); |