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)); } }
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; }
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; }
bool Socket::isConnected(void) { if (m_connectionInProgress) return true; if (m_sock < 0) return false; if (getSocketError() != 0) return false; return !waitForSocket(POLLHUP); }
void DGLDebugeeQTProcess::pollReady() { if (m_Loaded) { if (waitForSocket(true)) { m_PollTimer->stop(); emit processReady(); } } else { if (m_SemLoader.try_wait()) { m_Loaded = true; pollReady(); } } }