<b>發送狀态機比接收狀态機相對要簡單</b>
<b></b>
<b>send_machine.h</b>
點選(此處)折疊或打開
#ifndef MOOON_AGENT_SEND_MACHINE_H
#define MOOON_AGENT_SEND_MACHINE_H
#include agent/config.h>
AGENT_NAMESPACE_BEGIN
class CAgentConnector;
class CSendMachine
{
public:
CSendMachine(CAgentConnector* connector);
bool is_finish() const;
util::handle_result_t continue_send();
util::handle_result_t send(const char* msg, size_t msg_size);
void reset();
private:
CAgentConnector* _connector;
const char* _cursor;
size_t _remain_size;
};
AGENT_NAMESPACE_END
#endif // MOOON_AGENT_SEND_MACHINE_H
<b>send_machine.cpp</b>
#include "send_machine.h"
#include "agent_connector.h"
CSendMachine::CSendMachine(CAgentConnector* connector)
:_connector(connector)
reset();
}
// 目前消息是否已經發送完
bool CSendMachine::is_finish() const
return 0 == _remain_size;
// 發送消息,可能是一個消息的第一次發送,也可能是一個消息的非第一次發送
util::handle_result_t CSendMachine::continue_send()
ssize_t bytes_sent = _connector->send(_cursor, _remain_size);
if (bytes_sent > -1)
{
_cursor += bytes_sent;
_remain_size -= bytes_sent;
}
return is_finish()
? util::handle_finish
: util::handle_continue;
// 發送消息,總是一個消息的第一次發送
// 參數說明:
// msg - 需要發送的消息
// msg_size - 需要發送的消息位元組數
util::handle_result_t CSendMachine::send(const char* msg, size_t msg_size)
_cursor = msg;
_remain_size = msg_size;
return continue_send();
void CSendMachine::reset()
_cursor = NULL;
_remain_size = 0;