Welcome

首页 / 软件开发 / C++ / Muduo 网络编程示例(一) 五个简单TCP协议

Muduo 网络编程示例(一) 五个简单TCP协议2014-04-03 Blog.csdn.net 陈硕本文将介绍第一个示例:五个简单 TCP 网络服务协议,包括 echo (RFC 862)、discard (RFC 863) 、chargen (RFC 864)、daytime (RFC 867)、time (RFC 868),以及 time 协议的客户端。各协议的功 能简介如下:

* discard - 丢弃所有收到的数据;

* daytime - 服务端 accept 连接之 后,以字符串形式发送当前时间,然后主动断开连接;

* time - 服务端 accept 连接之后,以 二进制形式发送当前时间(从 Epoch 到现在的秒数),然后主动断开连接;我们需要一个客户程序来 把收到的时间转换为字符串。

* echo - 回显服务,把收到的数据发回客户端;

* chargen - 服务端 accept 连接之后,不停地发送测试数据。

以上五个协议使用不同的端口, 可以放到同一个进程中实现,且不必使用多线程。完整的代码见 muduo/examples/simple,下载地址 http://muduo.googlecode.com/files/muduo-0.1.6-alpha.tar.gz 。

discard

Discard 恐怕算是最简单的长连接 TCP 应用层协议,它只需要关注“三个半事件”中的“消息 /数据到达”事件,事件处理函数如下:

  1: void DiscardServer::onMessage(const muduo::net::TcpConnectionPtr& conn,   2:                  muduo::net::Buffer* buf,   3:                  muduo::Timestamp time)   4: {   5:   string msg(buf->retrieveAsString());  // 取回读到的全部数据   6:   LOG_INFO << conn->name() << " discards " << msg.size() << " bytes at " << time.toString();   7: }
剩下的都是例行公事的代码:

定义一个 DiscardServer class,以 TcpServer 为成员。

  1: #ifndef MUDUO_EXAMPLES_SIMPLE_DISCARD_DISCARD_H   2: #define MUDUO_EXAMPLES_SIMPLE_DISCARD_DISCARD_H   3:    4: #include <muduo/net/TcpServer.h>   5:    6: // RFC 863   7: class DiscardServer   8: {   9:  public:  10:   DiscardServer(muduo::net::EventLoop* loop,  11:                 const muduo::net::InetAddress& listenAddr);  12:   13:   void start();  14:   15:  private:  16:   void onConnection(const muduo::net::TcpConnectionPtr& conn);  17:   18:   void onMessage(const muduo::net::TcpConnectionPtr& conn,  19:                  muduo::net::Buffer* buf,  20:                  muduo::Timestamp time);  21:   22:   muduo::net::EventLoop* loop_;  23:   muduo::net::TcpServer server_;  24: };  25:   26: #endif  // MUDUO_EXAMPLES_SIMPLE_DISCARD_DISCARD_H