int SecureSocket::Recv(char* buf, int len, int /*flags*/) { int received0 = m_bio->num_read; int sent0 = m_bio->num_write; const int result = SSL_read(m_ssl, buf, len); if(result > 0) { int received1 = m_bio->num_read; int sent1 = m_bio->num_write; int physicalBytesSent = Offset(sent1, sent0); int physicalBytesReceived = Offset(received1, received0); int logicalBytesReceived = (result > 0) ? result : 0; OnReceived(logicalBytesReceived, physicalBytesSent, physicalBytesReceived); return result; } const DWORD status = WSAGetLastError(); if (WSAEWOULDBLOCK == status) { return 0; } const int code = SSL_get_error(m_ssl, result); if (SSL_ERROR_WANT_READ == code) { return 0; } return SOCKET_ERROR; }
bool CNetwork_Asio::Recv(uint16_t _size /*= 6*/) { OnReceive(); { (void)_size; std::error_code errorCode; int16_t BytesToRead = packet_size_ - packet_offset_; asio::async_read(socket_, asio::buffer(&buffer_[packet_offset_], BytesToRead), asio::transfer_exactly( BytesToRead), // We want at least 6 bytes of data [this](std::error_code errorCode, std::size_t length) { packet_offset_ += length; if (!errorCode || errorCode.value() == 11) { if (OnReceived() == false) { log_.eicprintf( CL_RESET "[%d] Something bad happened in OnReceived... Shutting " "down...\n" CL_RESET, GetId()); Shutdown(); } } else { if (errorCode.value() == 2) { log_.icprintf(CL_RESET CL_WHITE "[%d] Client disconnected.\n", GetId()); OnDisconnected(); Shutdown(); } else { log_.eicprintf( CL_RESET CL_WHITE "[%d] Error occurred[CNetwork_Asio::Recv:%i]: %s\n" CL_RESET, GetId(), errorCode.value(), errorCode.message().c_str()); Shutdown(); return; } } recv_condition_.notify_all(); if (active_) Recv(); }); } return true; }
void NET_BaseSocket::PrivateOnReceived() { if (!m_created) return; DWORD to_read, received = 0, flags = 0, space; OP( ioctlsocket(m_socket, FIONREAD, &to_read), "NET_BaseSocket::PrivateOnReceived, ioctlsocket" ); bool repeat = to_read > m_in_buf_size; if (repeat) to_read = m_in_buf_size; m_in_wsa_buf.buf = m_in_buf; m_in_wsa_buf.len = to_read; m_last_error = 0; OP2( WSARecv(m_socket, &m_in_wsa_buf, 1, &received, &flags, m_read_thread.GetOverlapped(), NULL), m_last_error != WSA_IO_PENDING, "NET_BaseSocket::PrivateOnReceived, WSARecv" ); if (m_last_error == WSA_IO_PENDING) { LOG_V0_AddMessage(LOG_V0_DEBUG_MESSAGE, TXT("%s::PrivateOnReceived -- PENDING") << GetName()); WSAResetEvent(m_read_thread.GetOverlapped()->hEvent); return; } { MutexWrap in_write_access(m_in_data->m_w_mutex); { MutexWrap in_read_access(m_in_data->m_r_mutex); space = m_in_data->SpaceFor(RingBuffer_WRITE); } if (space < received) OnError("NET_BaseSocket::PrivateOnReceived -- space < received !!!"); else { LOG_V0_AddMessage(LOG_V0_DEBUG_MESSAGE, TXT("%s -- получено %d") << GetName() << received); m_in_data->Write(m_in_buf, received); } } OnReceived(); if (repeat || received < to_read) WSASetEvent(m_read_thread.Event(0)); }
void RemoteDesktop::Network_Client::_HandleReceive(Packet_Header* p, const char* d, std::shared_ptr<SocketHandler>& s){ if (_Running && OnReceived) OnReceived(p, d, s); }