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; }
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; }
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; } }