Browse Source

Windows uses exceptfds to report failed async connect() in select(). TCP now done on Windows (I think).

Adam Ierymenko 11 years ago
parent
commit
7957ab6b1d
3 changed files with 20 additions and 2 deletions
  1. 15 0
      node/SocketManager.cpp
  2. 1 1
      node/TcpSocket.cpp
  3. 4 1
      node/TcpSocket.hpp

+ 15 - 0
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 {

+ 1 - 1
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)

+ 4 - 1
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);