6.4.3 七步实现finger 服务(1)
Python Twisted 是一款非常好的网络库,它也采用Reactor 作为网络编程(www.cppentry.com)的基本模型,所以从使用上与muduo 颇有相似之处(当然,muduo 没有deferreds)。
finger 是Twisted 文档的一个经典例子,本文展示如何用muduo 来实现最简单的finger 服务端。限于篇幅,只实现finger01finger07。代码位于examples/twisted/finger。
1. 拒绝连接。什么都不做,程序空等。
- examples/twisted/finger/finger01.cc
- 1 #include <muduo/net/EventLoop.h>
- 2
- 3 using namespace muduo;
- 4 using namespace muduo::net;
- 5
- 6 int main()
- 7 {
- 8 EventLoop loop;
- 9 loop.loop();
- 10 }
- examples/twisted/finger/finger01.cc
2. 接受新连接。在1079 端口侦听新连接,接受连接之后什么都不做,程序空等。muduo 会自动丢弃收到的数据。- examples/twisted/finger/finger02.cc
- 1 #include <muduo/net/EventLoop.h>
- 2 #include <muduo/net/TcpServer.h>
- 3
- 4 using namespace muduo;
- 5 using namespace muduo::net;
- 6
- 7 int main()
- 8 {
- 9 EventLoop loop;
- 10 TcpServer server(&loop, InetAddress(1079), "Finger");
- 11 server.start();
- 12 loop.loop();
- 13 }
- examples/twisted/finger/finger02.cc
3. 主动断开连接。接受新连接之后主动断开。以下省略头文件和namespace。 - examples/twisted/finger/finger03.cc
- 7 void onConnection(const TcpConnectionPtr& conn)
- 8 {
- 9 if (conn->connected())
- 10 {
- 11 conn->shutdown();
- 12 }
- 13 }
- 14
- 15 int main()
- 16 {
- 17 EventLoop loop;
- 18 TcpServer server(&loop, InetAddress(1079), "Finger");
- 19 server.setConnectionCallback(onConnection);
- 20 server.start();
- 21 loop.loop();
- 22 }
- examples/twisted/finger/finger03.cc
4. 读取用户名,然后断开连接。如果读到一行以\r\n 结尾的消息,就断开连接。注意这段代码有安全问题,如果恶意客户端不断发送数据而不换行,会撑爆服务端的内存。另外,Buffer::findCRLF() 是线性查找,如果客户端每次发一个字节,服务端的时间复杂度为O(N2),会消耗CPU 资源。- examples/twisted/finger/finger04.cc
- 7 void onMessage(const TcpConnectionPtr& conn,
- 8 Buffer* buf,
- 9 Timestamp receiveTime)
- 10 {
- 11 if (buf->findCRLF())
- 12 {
- 13 conn->shutdown();
- 14 }
- 15 }
- 16
- 17 int main()
- 18 {
- 19 EventLoop loop;
- 20 TcpServer server(&loop, InetAddress(1079), "Finger");
- 21 server.setMessageCallback(onMessage);
- 22 server.start();
- 23 loop.loop();
- 24 }
- examples/twisted/finger/finger04.cc