فهرست منبع

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

Adam Ierymenko 11 سال پیش
والد
کامیت
7957ab6b1d
3فایلهای تغییر یافته به همراه20 افزوده شده و 2 حذف شده
  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);