Example #1
0
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;
}