// 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; }
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; }
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; }