aboutsummaryrefslogtreecommitdiff
path: root/src/DirectConnection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/DirectConnection.cpp')
-rw-r--r--src/DirectConnection.cpp20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/DirectConnection.cpp b/src/DirectConnection.cpp
index 71c7f1f..083f557 100644
--- a/src/DirectConnection.cpp
+++ b/src/DirectConnection.cpp
@@ -29,7 +29,8 @@ namespace sibs
DirectConnections::DirectConnections(u16 _port) :
port(_port == 0 ? (u16)generateRandomNumber(2000, 32000) : _port),
- alive(true)
+ alive(true),
+ removeDisconnectedPeerCallback(nullptr)
{
UDT::startup();
eid = UDT::epoll_create();
@@ -185,6 +186,11 @@ namespace sibs
sendDataCallbackFunc(PubSubResult::OK, "");
}).detach();
}
+
+ void DirectConnections::onRemoveDisconnectedPeer(PubSubOnRemoveDisconnectedPeerCallback callbackFunc)
+ {
+ removeDisconnectedPeerCallback = callbackFunc;
+ }
bool DirectConnections::removePeer(int peerSocket)
{
@@ -193,6 +199,8 @@ namespace sibs
auto peerIt = peers.find(peerSocket);
if(peerIt != peers.end())
{
+ if(removeDisconnectedPeerCallback)
+ removeDisconnectedPeerCallback(peerIt->second);
UDT::epoll_remove_usock(eid, peerSocket);
peers.erase(peerIt);
wasRemoved = true;
@@ -206,10 +214,16 @@ namespace sibs
peersMutex.lock();
for(std::unordered_map<int, std::shared_ptr<DirectConnectionPeer>>::iterator it = peers.begin(); it != peers.end(); )
{
- UDTSTATUS peerSocketStatus = UDT::getsockstate(it->first);
+ int socket = it->first;
+ UDTSTATUS peerSocketStatus = UDT::getsockstate(socket);
if(peerSocketStatus == UDTSTATUS::BROKEN || peerSocketStatus == UDTSTATUS::CLOSING || peerSocketStatus == UDTSTATUS::CLOSED || peerSocketStatus == UDTSTATUS::NONEXIST)
{
- int socket = it->first;
+ if(removeDisconnectedPeerCallback)
+ removeDisconnectedPeerCallback(it->second);
+
+ if(peerSocketStatus == UDTSTATUS::BROKEN)
+ UDT::epoll_remove_usock(eid, socket);
+
Log::debug("UDT: Connection was broken to socket %d (peer most likely disconnected), removing peer", socket);
it = peers.erase(it);
Log::debug("UDT: Removed peer socket %d", socket);