Index: win/tclWinSock.c ================================================================== --- win/tclWinSock.c +++ win/tclWinSock.c @@ -1208,10 +1208,19 @@ if (infoPtr->lastError) { *errorCodePtr = infoPtr->lastError; result = 0; break; } else if (infoPtr->readyEvents & events) { + break; + } else if ((events == FD_CONNECT) && + !(infoPtr->flags & SOCKET_ASYNC_CONNECT)) { + /* When waiting for FD_CONNECT Windows may not deliver this event, + * causing us to get stuck. However, SocketProc()'s SOCKET_MESSAGE + * handler has special code which detects this and resets the + * infoPtr->flags async bit anyway (See (xxx)). That we can detect + * here and break the loop as if we had gotten FD_CONNECT. + */ break; } else if (infoPtr->flags & SOCKET_ASYNC) { *errorCodePtr = EWOULDBLOCK; result = 0; break; @@ -2325,10 +2334,11 @@ TclWinConvertWSAError((DWORD) error); infoPtr->lastError = Tcl_GetErrno(); } } + /* (xxx) See corresponding marker in WaitForSocketEvent as well */ if (infoPtr->flags & SOCKET_ASYNC_CONNECT) { infoPtr->flags &= ~(SOCKET_ASYNC_CONNECT); if (error != ERROR_SUCCESS) { TclWinConvertWSAError((DWORD) error); infoPtr->lastError = Tcl_GetErrno();