bool CNetwork_Asio::Send(std::unique_ptr<uint8_t> _buffer) {
  std::lock_guard<std::mutex> lock(send_mutex_);
  uint8_t* raw_ptr = _buffer.get();
  uint16_t _size = (uint16_t)raw_ptr[0];
  uint16_t _command = (uint16_t)raw_ptr[2];

  discard_mutex_.lock();
  discard_queue_.push(std::move(_buffer));
  raw_ptr = discard_queue_.back().get();
  discard_mutex_.unlock();

  if (OnSend(raw_ptr))
    asio::async_write(socket_, asio::buffer(raw_ptr, _size),
                      [this](const asio::error_code& error,
                             std::size_t bytes_transferred) {
      (void)bytes_transferred;
      if (!error) {
        OnSent();
      }
      discard_mutex_.lock();
      {
        std::unique_ptr<uint8_t> _buffer = std::move(discard_queue_.front());
        discard_queue_.pop();
        _buffer.reset(nullptr);
      }
      discard_mutex_.unlock();

    });
  else
    log_.eicprintf(CL_RESET "[%d] Not sending packet: Header[%i, 0x%X]\n",
                   GetId(), _size, _command);
  return true;
}
Exemple #2
0
int BufferIOEvent::SendData() {
  uint32_t cur_sent = 0;
  while (!tx_msg_mq_.Empty()) {
    const MessagePtr& tx_msg = tx_msg_mq_.First();
    uint32_t tosend = tx_msg->Size();
    int len = write(fd_, tx_msg->Data().data() + sent_, tosend - sent_);
    if (len < 0) {
      OnError(errno, strerror(errno));
      break;
    }
    sent_ += len;
    cur_sent += len;
    if (sent_ == tosend) {
      OnSent(tx_msg.get());
      tx_msg_mq_.EraseFirst();
      sent_ = 0;
    } else {
      /// sent_ less than tosend, breaking the sending loop and wait for next writing event
      break;
    }
  }
  if (tx_msg_mq_.Empty()) {
    DeleteWriteEvent();  // All data in the output buffer has been sent, then remove writing event from epoll
  }
  return cur_sent;
}
Exemple #3
0
int SecureSocket::Send(const char* buf, int len, int /*flags*/)
{
	int received0 = m_bio->num_read;
	int sent0 = m_bio->num_write;

	int result = SSL_write(m_ssl, buf, len);

	int received1 = m_bio->num_read;
	int sent1 = m_bio->num_write;

	int physicalBytesSent = Offset(sent1, sent0);
	int physicalBytesReceived = Offset(received1, received0);

	int logicalBytesSent = (result > 0) ? result : 0;

	OnSent(logicalBytesSent, physicalBytesSent, physicalBytesReceived);

	return result;
}
void NetSocket::OnCompletionSuccess(NetCompletionOP* bufObj, DWORD bytesTransfered)
{
    REFLIB_ASSERT_RETURN_IF_FAILED(bufObj, "OnCOmpletionFailure: NetCompletionOP is nullptr.");

    switch (bufObj->op)
    {
    case NetCompletionOP::OP_CONNECT:
        OnConnected();
        break;
    case NetCompletionOP::OP_READ:
        OnRecv(bufObj, bytesTransfered);
        break;
    case NetCompletionOP::OP_WRITE:
        OnSent(bufObj, bytesTransfered);
        break;
    case NetCompletionOP::OP_DISCONNECT:
        OnDisconnected();
        break;
    default:
        REFLIB_ASSERT(false, "Invalid net op");
        break;
    }
}