예제 #1
0
int	SockConnector::connect(SockStream &stream, BaseAddr &addr)
{
	//struct sockaddr_in _addr;	
	//memcpy(&_addr, addr.get_addr(), addr.get_addr_size());

	//LOG_PRN((LM_INFO, "SockConnector:: connect %s:%d\n", inet_ntoa(_addr.sin_addr), addr.port())); 
	if(stream.get_handle() == INVALID_SOCKET)
	{
		stream.open(AF_INET);
		if(stream.get_handle() == INVALID_SOCKET)
		{
			perror("socket");
#ifdef WIN32
			return GetLastError();
#else
			return errno;
#endif
		}
	}

	int res = ::connect(stream.get_handle() , reinterpret_cast<struct sockaddr *> (addr.get_addr()), (socklen_t)addr.get_size());
	
	if (res ==SOCKET_ERROR )
	{
		LOG_PRN((LM_WARNING, "SockConnector::connect() failed\n"));
		return -1;
	}
	return 0;	 
}
예제 #2
0
int
SockConnector::connect
    (
    SockStream& stream,
    const SockAddr& sockAddr,
    int reuseAddr,
    int protocolFamily,
    int protocol
    )
    {
    TRACE_CALL;

    if (stream.handleInvalid ())
	{
	// open on a new socket descriptor

	if (stream.open (SOCK_STREAM,
			 protocolFamily,
			 protocol,
			 reuseAddr) < 0)
	    return -1;		// cannot open
	}

    sockaddr* remoteAddr = 0;

    if (sockAddr.clone (remoteAddr) != -1)
	{
	size_t size = sockAddr.size ();

	REACTOR_HANDLE handle = stream.handleGet ();

	if (::connect (handle, remoteAddr, size) < 0)
	    stream.close ();
#if 0
	if (::bind (handle, remoteAddr, size) < 0)
	    stream.close ();
	else if (::connect (handle, remoteAddr, size) < 0)
	    stream.close ();
#endif
	}

    delete remoteAddr;

    return stream.handleInvalid () ? -1 : 0;
    }