<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;
本文转自eyjian 51CTO博客,原文链接:http://blog.51cto.com/mooon/910295,如需转载请自行联系原作者