示例#1
0
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;
}
示例#2
0
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;
}