summaryrefslogtreecommitdiff
path: root/node/SocketManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'node/SocketManager.cpp')
-rw-r--r--node/SocketManager.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/node/SocketManager.cpp b/node/SocketManager.cpp
index 2c583f09..3c94f22c 100644
--- a/node/SocketManager.cpp
+++ b/node/SocketManager.cpp
@@ -316,6 +316,8 @@ SocketManager::SocketManager(
_udpV4Socket = SharedPtr<Socket>(new UdpSocket(Socket::ZT_SOCKET_TYPE_UDP_V4,s));
}
}
+
+ _updateNfds();
}
SocketManager::~SocketManager()
@@ -370,7 +372,7 @@ void SocketManager::poll(unsigned long timeout)
tv.tv_sec = (long)(timeout / 1000);
tv.tv_usec = (long)((timeout % 1000) * 1000);
- select(_nfds,&rfds,&wfds,&efds,(timeout > 0) ? &tv : (struct timeval *)0);
+ select(_nfds + 1,&rfds,&wfds,&efds,(timeout > 0) ? &tv : (struct timeval *)0);
if (FD_ISSET(_whackReceivePipe,&rfds)) {
char tmp[32];
@@ -396,6 +398,8 @@ void SocketManager::poll(unsigned long timeout)
_fdSetLock.lock();
FD_SET(sockfd,&_readfds);
_fdSetLock.unlock();
+ if (sockfd > _nfds)
+ _nfds = sockfd;
}
}
if ((_tcpV6ListenSocket != INVALID_SOCKET)&&(FD_ISSET(_tcpV6ListenSocket,&rfds))) {
@@ -413,6 +417,8 @@ void SocketManager::poll(unsigned long timeout)
_fdSetLock.lock();
FD_SET(sockfd,&_readfds);
_fdSetLock.unlock();
+ if (sockfd > _nfds)
+ _nfds = sockfd;
}
}
@@ -421,6 +427,7 @@ void SocketManager::poll(unsigned long timeout)
if ((_udpV6Socket)&&(FD_ISSET(_udpV6Socket->_sock,&rfds)))
_udpV6Socket->notifyAvailableForRead(_udpV6Socket,this);
+ bool closedSockets = false;
{ // grab copy of TCP sockets list because _tcpSockets[] might be changed in a handler
Mutex::Lock _l2(_tcpSockets_m);
if (_tcpSockets.size()) {
@@ -436,6 +443,7 @@ void SocketManager::poll(unsigned long timeout)
FD_CLR(s->second->_sock,&_writefds);
_fdSetLock.unlock();
_tcpSockets.erase(s++);
+ closedSockets = true;
}
}
}
@@ -451,6 +459,7 @@ void SocketManager::poll(unsigned long timeout)
FD_CLR((*s)->_sock,&_readfds);
FD_CLR((*s)->_sock,&_writefds);
_fdSetLock.unlock();
+ closedSockets = true;
continue;
}
}
@@ -464,10 +473,13 @@ void SocketManager::poll(unsigned long timeout)
FD_CLR((*s)->_sock,&_readfds);
FD_CLR((*s)->_sock,&_writefds);
_fdSetLock.unlock();
+ closedSockets = true;
continue;
}
}
}
+ if (closedSockets)
+ _updateNfds();
}
void SocketManager::whack()