LNE_UINT SockConnector::Connect(SockPad &skpad, const SockAddr &addr, const TimeValue *tv) { LNE_UINT result = LNERR_UNKNOW; SOCKET sock = socket(addr.family(), SOCK_STREAM, IPPROTO_TCP); if(sock != INVALID_SOCKET) { if(tv) { #if defined(LNE_WIN32) unsigned long value = 1; if(ioctlsocket(sock, FIONBIO, &value) == 0) { #else int flags = fcntl(sock, F_GETFL); if(flags >= 0 && fcntl(sock, F_SETFL, flags | O_NONBLOCK) == 0) { #endif connect(sock, addr.addr(), addr.size()); fd_set fds; FD_ZERO(&fds); FD_SET((SOCKET)sock, &fds); TimeValue timeout(*tv); if(select(static_cast<int>((SOCKET)sock + 1), NULL, &fds, NULL, static_cast<timeval *>(timeout)) < 1) result = LNERR_TIMEOUT; else { #if defined(LNE_WIN32) value = 0; if(ioctlsocket(sock, FIONBIO, &value) == 0) #else if(fcntl(sock, F_SETFL, flags) == 0) #endif result = LNERR_OK; } } } else { if(connect(sock, addr.addr(), addr.size()) == 0) result = LNERR_OK; } if(result == LNERR_OK) skpad.Attach(addr.family(), sock); } return result; }