Пример #1
0
// asynchronous connect
bool IOProcessorConnect(FD& fd, Endpoint& endpoint)
{
	sockaddr_in	localAddr;
	IODesc*		iod;

	memset(&localAddr, 0, sizeof(sockaddr_in));
	localAddr.sin_family = AF_INET;
	localAddr.sin_addr.S_un.S_addr = INADDR_ANY;

	// the socket must be bound so that ConnectEx works
	if (bind(fd.sock, (sockaddr*) &localAddr,  sizeof(sockaddr_in)) == SOCKET_ERROR)
	{
		// WSAINVAL means it is already bound
		if (WSAGetLastError() != WSAEINVAL)
			return false;
	}

	iod = GetIODesc(fd);
	memset(&iod->ovlWrite, 0, sizeof(OVERLAPPED));
	if (!ConnectEx(fd.sock, (sockaddr*) endpoint.GetSockAddr(), ENDPOINT_SOCKADDR_SIZE, NULL, 0, NULL, &iod->ovlWrite))
	{
		if (WSAGetLastError() != WSA_IO_PENDING)
			return false;
	}

	return true;
}
Пример #2
0
bool Socket::GetEndpoint(Endpoint &endpoint)
{
    int ret;
    struct sockaddr* sa = (struct sockaddr*) endpoint.GetSockAddr();
    socklen_t len = ENDPOINT_SOCKADDR_SIZE;
    
    ret = getpeername(fd, sa, &len);
    
    if (ret < 0)
    {
        Log_Errno();
        Close();
        return false;
    }
    
    return true;
}
Пример #3
0
bool Socket::Connect(Endpoint &endpoint)
{
    int ret;
    struct sockaddr* sa = (struct sockaddr*) endpoint.GetSockAddr();
    
    ret = connect(fd, sa, ENDPOINT_SOCKADDR_SIZE);
    
    if (ret < 0)
    {
        if (errno != EINPROGRESS)
        {
            Log_Errno();
            return false;
        }
    }

    return true;
}