int SockConnector::connect(SockStream &stream, BaseAddr &addr, TimeValue &tv) { int rv = 0; // non-block socket stream.set_nonblocking(); // connect rv = ::connect(stream.get_handle(), reinterpret_cast<struct sockaddr *> (addr.get_addr()), (socklen_t)addr.get_size()); if (rv == 0) { // connect success } else { #ifdef _WIN32 int sock_errcode = WSAGetLastError(); #else int sock_errcode = errno; #endif // printf("SockConnector::connect(): addr.get_size()=%d, addr.get_type()=%X\n", addr.get_size(), addr.get_type()); if (addr.get_type() == AF_UNIX) { //const UnixAddr &unixaddr = dynamic_cast<const UnixAddr &> (addr); //printf("SockConnector:: UNIX ADDR: %s\n", unixaddr.get_path()); } else { //InetAddr &inetaddr = dynamic_cast<InetAddr &> (addr); //printf("SockConnector:: INET ADDR: %s : %d\n", // inetaddr.get_host_addr(), // inetaddr.get_port_number()); } // if socket error other than EINPROGRESS, return -1; if (sock_errcode == EINPROGRESS || sock_errcode == EINTR) { //printf("SockConnector: EINPROGRESS[%d]\n", sock_errcode); int revent = stream.poll_out(tv); //printf("SockConnector: revent=%02X\n", revent); if (IS_POLL_W(revent)) rv = 0; else if (IS_POLL_E(revent)) rv = -1; } else { printf("SockConnector::connect() error: %d\n", sock_errcode); rv = -1; } } // restore file status flags stream.set_blocking(); return rv; }
int SockConnector::connect(SockStream &stream, InetAddr &addr, TimeValue &tv) { int rv = 0; // non-block socket stream.set_nonblocking(); #ifdef _WIN32 // connect rv = ::connect(stream.get_handle(), (const struct sockaddr *) addr.get_addr(), (socklen_t)addr.get_addr_size()); if (rv != -1) { rv = 0; } else { if (WSAGetLastError() == WSAEWOULDBLOCK) { //printf("connect InProgress [%d]\n", sock); fd_set rset; fd_set wset; FD_ZERO(&rset); FD_ZERO(&wset); FD_SET(stream.get_handle(), &rset); FD_SET(stream.get_handle(), &wset); rv = ::select(0, &rset, &wset, NULL, (struct timeval*)tv.timeval()); if (rv == 0) { perror("connect timeout"); rv = -1; } else if (FD_ISSET(stream.get_handle(), &rset) || FD_ISSET(stream.get_handle(), &wset)) { int error = 0; socklen_t len = sizeof(error); if (getsockopt(stream.get_handle(), SOL_SOCKET, SO_ERROR, (char *)&error, &len) == 0) { // select error if (error == 0) { rv = 0; } else { closesocket(stream.get_handle()); perror("connect"); rv = -1; } } } else { perror("connect"); rv = -1; } } else { perror("connect"); rv = -1; } } #endif // restore file status flags stream.set_blocking(); return rv; }