diff options
author | Adam Ierymenko <adam.ierymenko@zerotier.com> | 2014-03-28 13:37:21 -0700 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@zerotier.com> | 2014-03-28 13:37:21 -0700 |
commit | 7957ab6b1df2c5221d702d205397365fcbe93d98 (patch) | |
tree | a6dcecfd1ed0ed438317d778de796bafb266cf7d | |
parent | e8b613e625d18a03d14073e4634cdfb64e120d38 (diff) | |
download | infinitytier-7957ab6b1df2c5221d702d205397365fcbe93d98.tar.gz infinitytier-7957ab6b1df2c5221d702d205397365fcbe93d98.zip |
Windows uses exceptfds to report failed async connect() in select(). TCP now done on Windows (I think).
-rw-r--r-- | node/SocketManager.cpp | 15 | ||||
-rw-r--r-- | node/TcpSocket.cpp | 2 | ||||
-rw-r--r-- | node/TcpSocket.hpp | 5 |
3 files changed, 20 insertions, 2 deletions
diff --git a/node/SocketManager.cpp b/node/SocketManager.cpp index 41facdc0..722db5b1 100644 --- a/node/SocketManager.cpp +++ b/node/SocketManager.cpp @@ -459,6 +459,17 @@ void SocketManager::poll(unsigned long timeout) _fdSetLock.unlock(); FD_ZERO(&efds); +#ifdef __WINDOWS__ + // Windows signals failed connects in exceptfds + { + Mutex::Lock _l2(_tcpSockets_m); + for(std::map< InetAddress,SharedPtr<Socket> >::iterator s(_tcpSockets.begin());s!=_tcpSockets.end();++s) { + if (((TcpSocket *)s->second.ptr())->_connecting) + FD_SET(s->second->_sock,&efds); + } + } +#endif + tv.tv_sec = (long)(timeout / 1000); tv.tv_usec = (long)((timeout % 1000) * 1000); select(_nfds + 1,&rfds,&wfds,&efds,(timeout > 0) ? &tv : (struct timeval *)0); @@ -567,7 +578,11 @@ void SocketManager::poll(unsigned long timeout) ts.reserve(_tcpSockets.size()); uint64_t now = Utils::now(); for(std::map< InetAddress,SharedPtr<Socket> >::iterator s(_tcpSockets.begin());s!=_tcpSockets.end();) { +#ifdef __WINDOWS__ + if ( ((now - ((TcpSocket *)s->second.ptr())->_lastActivity) < ZT_TCP_TUNNEL_ACTIVITY_TIMEOUT) && (! ((((TcpSocket *)s->second.ptr())->_connecting)&&(FD_ISSET(s->second->_sock,&efds))) ) ) { +#else if ((now - ((TcpSocket *)s->second.ptr())->_lastActivity) < ZT_TCP_TUNNEL_ACTIVITY_TIMEOUT) { +#endif ts.push_back(s->second); ++s; } else { diff --git a/node/TcpSocket.cpp b/node/TcpSocket.cpp index fd8e9a94..7dbcc4e1 100644 --- a/node/TcpSocket.cpp +++ b/node/TcpSocket.cpp @@ -59,9 +59,9 @@ TcpSocket::~TcpSocket() #else ::close(_sock); #endif - if (_outbuf) ::free(_outbuf); + //printf("!!! TCP SOCKET DESTROYED @%.16llx to %s\r\n",(unsigned long long)this,_remote.toString().c_str()); } bool TcpSocket::send(const InetAddress &to,const void *msg,unsigned int msglen) diff --git a/node/TcpSocket.hpp b/node/TcpSocket.hpp index 0c24808d..ea2b0ddf 100644 --- a/node/TcpSocket.hpp +++ b/node/TcpSocket.hpp @@ -83,7 +83,10 @@ protected: _outbufsize(0), _inptr(0), _connecting(c), - _remote(r) {} + _remote(r) + { + //printf("!!! TCP SOCKET CREATED @%.16llx to %s\r\n",(unsigned long long)this,_remote.toString().c_str()); + } virtual bool notifyAvailableForRead(const SharedPtr<Socket> &self,SocketManager *sm); virtual bool notifyAvailableForWrite(const SharedPtr<Socket> &self,SocketManager *sm); |