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 。discardDiscard 恐怕算是最简单的长连接 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