Exemple #1
0
bool Socket::receiveFromServer(BinaryQueue &queue) {
    if (!waitForSocket(POLLIN)) {
        LOGD("No POLLIN event");
        return true;
    }

    RawBuffer buffer(BUFSIZ);
    ssize_t size = 0;
    while (true) {
        size = TEMP_FAILURE_RETRY(read(m_sock, buffer.data(), BUFSIZ));
        if (size == 0) {
            LOGW("read return 0 / Connection closed by server.");
            return false;
        }

        if (size == -1) {
            int err = errno;
            switch (err) {
                case EAGAIN:
#if EWOULDBLOCK != EAGAIN
                case EWOULDBLOCK:
#endif
                    return true;
                case ECONNRESET:
                    LOGW("read returned -1 with ECONNRESET / Connection closed by server.");
                    return false;
                default:
                    LOGE("'read' function error [%d] : <%s>", err, strerror(err));
                    throw UnexpectedErrorException(err, strerror(err));
            }
        }

        queue.appendCopy(buffer.data(), static_cast<size_t>(size));
    }
}
Exemple #2
0
Socket::SendStatus Socket::sendBuffer(void) {
    while (m_sendBufferEnd != m_sendBufferPos) {
        if (!waitForSocket(POLLOUT)) {
            LOGD("No POLLOUT event");
            return SendStatus::PARTIAL_DATA_SENT;
        }

        ssize_t t = TEMP_FAILURE_RETRY(send(m_sock, m_sendBuffer.data() + m_sendBufferPos,
                                            m_sendBufferEnd - m_sendBufferPos, MSG_NOSIGNAL));
        if (t == -1) {
            int err = errno;
            switch (err) {
                case EAGAIN:
#if EWOULDBLOCK != EAGAIN
                case EWOULDBLOCK:
#endif
                    continue;
                case ENOMEM:
                    throw NoMemoryException("'send' function failed due to ENOMEM");
                case EPIPE:
                    LOGN("Connection closed by server");
                    return SendStatus::CONNECTION_LOST;
                default:
                    LOGE("'send' function error [%d] : <%s>", err, strerror(err));
                    throw UnexpectedErrorException(err, strerror(err));
            }
        }
        m_sendBufferPos += static_cast<size_t>(t);
    }
    return SendStatus::ALL_DATA_SENT;
}
Exemple #3
0
Socket::ConnectionStatus Socket::completeConnection(void) {
    if (!m_connectionInProgress)
        return ConnectionStatus::ALREADY_CONNECTED;

    if (!waitForSocket(POLLOUT))
        return ConnectionStatus::CONNECTION_IN_PROGRESS;

    m_connectionInProgress = false;
    return isConnected() ? ConnectionStatus::CONNECTION_SUCCEEDED
                         : ConnectionStatus::CONNECTION_FAILED;
}
Exemple #4
0
bool Socket::isConnected(void) {
    if (m_connectionInProgress)
        return true;

    if (m_sock < 0)
        return false;

    if (getSocketError() != 0)
        return false;

    return !waitForSocket(POLLHUP);
}
Exemple #5
0
void DGLDebugeeQTProcess::pollReady() {
    if (m_Loaded) {
        if (waitForSocket(true)) {
            m_PollTimer->stop();
            emit processReady();
        }
    } else {
        if (m_SemLoader.try_wait()) {
            m_Loaded = true;
            pollReady();
        }
    }
}