发送状态机比接收状态机相对要简单
- send_machine.h
#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;
private:
const char* _cursor;
size_t _remain_size;
};
AGENT_NAMESPACE_END
#endif // MOOON_AGENT_SEND_MACHINE_H
- send_machine.cpp
#include "send_machine.h"
#include "agent_connector.h"
AGENT_NAMESPACE_BEGIN
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;
}
AGENT_NAMESPACE_END