设为首页 加入收藏

TOP

6.4.3 七步实现finger 服务(1)
2013-10-07 16:02:47 来源: 作者: 【 】 浏览:50
Tags:6.4.3 实现 finger 服务

6.4.3 七步实现finger 服务(1)

Python Twisted 是一款非常好的网络库,它也采用Reactor 作为网络编程(www.cppentry.com)的基本模型,所以从使用上与muduo 颇有相似之处(当然,muduo 没有deferreds)。

finger 是Twisted 文档的一个经典例子,本文展示如何用muduo 来实现最简单的finger 服务端。限于篇幅,只实现finger01finger07。代码位于examples/twisted/finger。

1. 拒绝连接。什么都不做,程序空等。

  1. examples/twisted/finger/finger01.cc  
  2. 1 #include <muduo/net/EventLoop.h> 
  3. 2  
  4. 3 using namespace muduo;  
  5. 4 using namespace muduo::net;  
  6. 5  
  7. 6 int main()  
  8. 7 {  
  9. 8 EventLoop loop;  
  10. 9 loop.loop();  
  11. 10 }  
  12. examples/twisted/finger/finger01.cc 

2. 接受新连接。在1079 端口侦听新连接,接受连接之后什么都不做,程序空等。muduo 会自动丢弃收到的数据。
  1. examples/twisted/finger/finger02.cc  
  2. 1 #include <muduo/net/EventLoop.h> 
  3. 2 #include <muduo/net/TcpServer.h> 
  4. 3  
  5. 4 using namespace muduo;  
  6. 5 using namespace muduo::net;  
  7. 6  
  8. 7 int main()  
  9. 8 {  
  10. 9 EventLoop loop;  
  11. 10 TcpServer server(&loop, InetAddress(1079), "Finger");  
  12. 11 server.start();  
  13. 12 loop.loop();  
  14. 13 }  
  15. examples/twisted/finger/finger02.cc 

3. 主动断开连接。接受新连接之后主动断开。以下省略头文件和namespace。
  1. examples/twisted/finger/finger03.cc  
  2. 7 void onConnection(const TcpConnectionPtr& conn)  
  3. 8 {  
  4. 9 if (conn->connected())  
  5. 10 {  
  6. 11 conn->shutdown();  
  7. 12 }  
  8. 13 }  
  9. 14  
  10. 15 int main()  
  11. 16 {  
  12. 17 EventLoop loop;  
  13. 18 TcpServer server(&loop, InetAddress(1079), "Finger");  
  14. 19 server.setConnectionCallback(onConnection);  
  15. 20 server.start();  
  16. 21 loop.loop();  
  17. 22 }  
  18. examples/twisted/finger/finger03.cc 

4. 读取用户名,然后断开连接。如果读到一行以\r\n 结尾的消息,就断开连接。注意这段代码有安全问题,如果恶意客户端不断发送数据而不换行,会撑爆服务端的内存。另外,Buffer::findCRLF() 是线性查找,如果客户端每次发一个字节,服务端的时间复杂度为O(N2),会消耗CPU 资源。
  1. examples/twisted/finger/finger04.cc  
  2. 7 void onMessage(const TcpConnectionPtr& conn,  
  3. 8 Buffer* buf,  
  4. 9 Timestamp receiveTime)  
  5. 10 {  
  6. 11 if (buf->findCRLF())  
  7. 12 {  
  8. 13 conn->shutdown();  
  9. 14 }  
  10. 15 }  
  11. 16  
  12. 17 int main()  
  13. 18 {  
  14. 19 EventLoop loop;  
  15. 20 TcpServer server(&loop, InetAddress(1079), "Finger");  
  16. 21 server.setMessageCallback(onMessage);  
  17. 22 server.start();  
  18. 23 loop.loop();  
  19. 24 }  
  20. examples/twisted/finger/finger04.cc 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇6.4.2 echo 服务的实现(2) 下一篇6.4.3 七步实现finger 服务(2)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·MySQL 安装及连接-腾 (2025-12-25 06:20:28)
·MySQL的下载、安装、 (2025-12-25 06:20:26)
·MySQL 中文网:探索 (2025-12-25 06:20:23)
·Shell脚本:Linux Sh (2025-12-25 05:50:11)
·VMware虚拟机安装Lin (2025-12-25 05:50:08)