Esempio n. 1
0
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;
}
Esempio n. 3
0
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);
}