发送状态机比接收状态机相对要简单
- 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