-// sockaddr_in sockAddrIPv4;
-// sockaddr_in6 sockAddrIPv6;
-// sockaddr* sockAddrPtr = 0;
-// BT_SOCKLEN_T sockAddrSize = 0;
-
-// // IPv6
-// if ( address.GetProtocol() == HostAddress::IPv6Protocol ) {
-
-// memset(&sockAddrIPv6, 0, sizeof(sockAddrIPv6));
-// sockAddrIPv6.sin6_family = AF_INET6;
-// sockAddrIPv6.sin6_port = htons(port);
-
-// IPv6Address ip6 = address.GetIPv6Address();
-// memcpy(&sockAddrIPv6.sin6_addr.s6_addr, &ip6, sizeof(ip6));
-
-// sockAddrSize = sizeof(sockAddrIPv6);
-// sockAddrPtr = (sockaddr*)&sockAddrIPv6;
-// }
-
-// // IPv4
-// else if ( address.GetProtocol() == HostAddress::IPv4Protocol ) {
-
-// memset(&sockAddrIPv4, 0, sizeof(sockAddrIPv4));
-// sockAddrIPv4.sin_family = AF_INET;
-// sockAddrIPv4.sin_port = htons(port);
-// sockAddrIPv4.sin_addr.s_addr = htonl(address.GetIPv4Address());
-
-// sockAddrSize = sizeof(sockAddrIPv4);
-// sockAddrPtr = (sockaddr*)&sockAddrIPv4;
-// }
-
-// // unknown (should be unreachable)
-// else BT_ASSERT_X(false, "TcpSocketEngine::nativeConnect() : unknown network protocol");
-
-// // attempt conenction
-// int connectResult = connect(socketDescriptor, sockAddrPtr, sockAddrSize);
-
-// // if hit error
-// if ( connectResult == -1 ) {
-
-// // see what error was encountered
-// switch ( errno ) {
-
-// case EISCONN:
-// m_socketState = TcpSocket::ConnectedState;
-// break;
-// case ECONNREFUSED:
-// case EINVAL:
-// m_socketError = TcpSocket::ConnectionRefusedError;
-// m_socketState = TcpSocket::UnconnectedState;
-// m_errorString = "connection refused";
-// break;
-// case ETIMEDOUT:
-// m_socketError = TcpSocket::NetworkError;
-// m_errorString = "connection timed out";
-// break;
-// case EHOSTUNREACH:
-// m_socketError = TcpSocket::NetworkError;
-// m_socketState = TcpSocket::UnconnectedState;
-// m_errorString = "host unreachable";
-// break;
-// case ENETUNREACH:
-// m_socketError = TcpSocket::NetworkError;
-// m_socketState = TcpSocket::UnconnectedState;
-// m_errorString = "network unreachable";
-// break;
-// case EADDRINUSE:
-// m_socketError = TcpSocket::NetworkError;
-// m_errorString = "address already in use";
-// break;
-// case EACCES:
-// case EPERM:
-// m_socketError = TcpSocket::SocketAccessError;
-// m_socketState = TcpSocket::UnconnectedState;
-// m_errorString = "permission denied";
-// case EAFNOSUPPORT:
-// case EBADF:
-// case EFAULT:
-// case ENOTSOCK:
-// m_socketState = TcpSocket::UnconnectedState;
-// default:
-// break;
-// }
-
-// if ( m_socketState != TcpSocket::ConnectedState )
-// return false;
-// }
-
-// // otherwise, we should be good
-// // update state & return success
-// m_socketState = TcpSocket::ConnectedState;
-// return true;
+ sockaddr_in sockAddrIPv4;
+ sockaddr_in6 sockAddrIPv6;
+ sockaddr* sockAddrPtr = 0;
+ BT_SOCKLEN_T sockAddrSize = 0;
+
+ // IPv6
+ if ( address.GetProtocol() == HostAddress::IPv6Protocol ) {
+
+ memset(&sockAddrIPv6, 0, sizeof(sockAddrIPv6));
+ sockAddrIPv6.sin6_family = AF_INET6;
+ sockAddrIPv6.sin6_port = htons(port);
+
+ IPv6Address ip6 = address.GetIPv6Address();
+ memcpy(&sockAddrIPv6.sin6_addr.s6_addr, &ip6, sizeof(ip6));
+
+ sockAddrSize = sizeof(sockAddrIPv6);
+ sockAddrPtr = (sockaddr*)&sockAddrIPv6;
+ }
+
+ // IPv4
+ else if ( address.GetProtocol() == HostAddress::IPv4Protocol ) {
+
+ memset(&sockAddrIPv4, 0, sizeof(sockAddrIPv4));
+ sockAddrIPv4.sin_family = AF_INET;
+ sockAddrIPv4.sin_port = htons(port);
+ sockAddrIPv4.sin_addr.s_addr = htonl(address.GetIPv4Address());
+
+ sockAddrSize = sizeof(sockAddrIPv4);
+ sockAddrPtr = (sockaddr*)&sockAddrIPv4;
+ }
+
+ // unknown (should be unreachable)
+ else BT_ASSERT_X(false, "TcpSocketEngine::nativeConnect() : unknown network protocol");
+
+ // attempt conenction
+ const int connectResult = WSAConnect(m_socketDescriptor, sockAddrPtr, sockAddrSize, 0, 0, 0, 0);
+
+ // if failed, handle error
+ if ( connectResult == SOCKET_ERROR ) {
+
+ // ensure state is set before checking error code
+ m_socketState = TcpSocket::UnconnectedState;
+
+ // set error type/message depending on errorCode
+ const int errorCode = WSAGetLastError();
+ switch ( errorCode ) {
+ case WSANOTINITIALISED:
+ m_socketError = TcpSocket::UnknownSocketError;
+ m_errorString = "Windows socket functionality not properly initialized";
+ break;
+ case WSAEISCONN:
+ m_socketState = TcpSocket::ConnectedState; // socket already connected
+ break;
+ case WSAECONNREFUSED:
+ case WSAEINVAL:
+ m_socketError = TcpSocket::ConnectionRefusedError;
+ m_errorString = "connection refused";
+ break;
+ case WSAETIMEDOUT:
+ m_socketError = TcpSocket::NetworkError;
+ m_errorString = "connection timed out";
+ break;
+ case WSAEHOSTUNREACH:
+ m_socketError = TcpSocket::NetworkError;
+ m_errorString = "host unreachable";
+ break;
+ case WSAENETUNREACH:
+ m_socketError = TcpSocket::NetworkError;
+ m_errorString = "network unreachable";
+ break;
+ case WSAEADDRINUSE:
+ m_socketError = TcpSocket::SocketResourceError;
+ m_errorString = "address already in use";
+ break;
+ case WSAEACCES:
+ m_socketError = TcpSocket::SocketAccessError;
+ m_errorString = "permission denied";
+ break;
+ default:
+ break;
+ }
+
+ // double check that we're not in 'connected' state; if so, return failure
+ if ( m_socketState != TcpSocket::ConnectedState )
+ return false;
+ }
+
+ // otherwise, we should be good
+ // update state & return success
+ m_socketState = TcpSocket::ConnectedState;
+ return true;