Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8139548
  • 博文数量: 594
  • 博客积分: 13065
  • 博客等级: 上将
  • 技术积分: 10324
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-26 16:44
个人简介

推荐: blog.csdn.net/aquester https://github.com/eyjian https://www.cnblogs.com/aquester http://blog.chinaunix.net/uid/20682147.html

文章分类

全部博文(594)

分类: C/C++

2012-06-03 22:27:19

发送状态机比接收状态机相对要简单

  • send_machine.h

点击(此处)折叠或打开

  1. #ifndef MOOON_AGENT_SEND_MACHINE_H
  2. #define MOOON_AGENT_SEND_MACHINE_H
  3. #include <agent/config.h>
  4. AGENT_NAMESPACE_BEGIN

  5. class CAgentConnector;
  6. class CSendMachine
  7. {
  8. public:
  9.     CSendMachine(CAgentConnector* connector);
  10.     bool is_finish() const;
  11.     util::handle_result_t continue_send();
  12.     util::handle_result_t send(const char* msg, size_t msg_size);
  13.     void reset();
  14.     
  15. private:
  16.     CAgentConnector* _connector;
  17.     
  18. private:
  19.     const char* _cursor;
  20.     size_t _remain_size;
  21. };

  22. AGENT_NAMESPACE_END
  23. #endif // MOOON_AGENT_SEND_MACHINE_H

  • send_machine.cpp

点击(此处)折叠或打开

  1. #include "send_machine.h"
  2. #include "agent_connector.h"
  3. AGENT_NAMESPACE_BEGIN

  4. CSendMachine::CSendMachine(CAgentConnector* connector)
  5.  :_connector(connector)
  6. {
  7.     reset();
  8. }

  9. // 当前消息是否已经发送完
  10. bool CSendMachine::is_finish() const
  11. {
  12.     return 0 == _remain_size;
  13. }

  14. // 发送消息,可能是一个消息的第一次发送,也可能是一个消息的非第一次发送
  15. util::handle_result_t CSendMachine::continue_send()
  16. {
  17.     ssize_t bytes_sent = _connector->send(_cursor, _remain_size);
  18.     if (bytes_sent > -1)
  19.     {
  20.         _cursor += bytes_sent;
  21.         _remain_size -= bytes_sent;
  22.     }
  23.     
  24.     return is_finish()
  25.          ? util::handle_finish
  26.          : util::handle_continue;
  27. }

  28. // 发送消息,总是一个消息的第一次发送
  29. // 参数说明:
  30. // msg - 需要发送的消息
  31. // msg_size - 需要发送的消息字节数
  32. util::handle_result_t CSendMachine::send(const char* msg, size_t msg_size)
  33. {
  34.     _cursor = msg;
  35.     _remain_size = msg_size;
  36.     
  37.     return continue_send();
  38. }

  39. void CSendMachine::reset()
  40. {
  41.     _cursor = NULL;
  42.     _remain_size = 0;
  43. }

  44. AGENT_NAMESPACE_END

阅读(1896) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~