6.4.3 七步实现finger 服务(2)

2013-10-07 16:02:45 · 作者: · 浏览: 50

6.4.3 七步实现finger 服务(2)

5. 读取用户名、输出错误信息,然后断开连接。如果读到一行以\r\n 结尾的消息,就发送一条出错信息,然后断开连接。安全问题同上。

  1. --- examples/twisted/finger/finger04.cc 2010-08-29 00:03:14 +0800  
  2. +++ examples/twisted/finger/finger05.cc 2010-08-29 00:06:05 +0800  
  3. @@ -7,12 +7,13 @@  
  4. void onMessage(const TcpConnectionPtr& conn,  
  5. Buffer* buf,  
  6. Timestamp receiveTime)  
  7. {  
  8. if (buf->findCRLF())  
  9. {  
  10. + conn->send("No such user\r\n");  
  11. conn->shutdown();  
  12. }  

6. 从空的UserMap 里查找用户。从一行消息中拿到用户名(L30),在UserMap里查找,然后返回结果。安全问题同上。
  1. examples/twisted/finger/finger06.cc  
  2. 9 typedef std::map<string, string> UserMap;  
  3. 10 UserMap users;  
  4. 11  
  5. 12 string getUser(const string& user)  
  6. 13 {  
  7. 14 string result = "No such user";  
  8. 15 UserMap::iterator it = users.find(user);  
  9. 16 if (it != users.end())  
  10. 17 {  
  11. 18 result = it->second;  
  12. 19 }  
  13. 20 return result;  
  14. 21 }  
  15. 22  
  16. 23 void onMessage(const TcpConnectionPtr& conn,  
  17. 24 Buffer* buf,  
  18. 25 Timestamp receiveTime)  
  19. 26 {  
  20. 27 const char* crlf = buf->findCRLF();  
  21. 28 if (crlf)  
  22. 29 {  
  23. 30 string user(buf->peek(), crlf);  
  24. 31 conn->send(getUser(user) + "\r\n");  
  25. 32 buf->retrieveUntil(crlf + 2);  
  26. 33 conn->shutdown();  
  27. 34 }  
  28. 35 }  
  29. 36  
  30. 37 int main()  
  31. 38 {  
  32. 39 EventLoop loop;  
  33. 40 TcpServer server(&loop, InetAddress(1079), "Finger");  
  34. 41 server.setMessageCallback(onMessage);  
  35. 42 server.start();  
  36. 43 loop.loop();  
  37. 44 }  
  38. examples/twisted/finger/finger06.cc 

7. 往UserMap 里添加一个用户。与前面几乎完全一样,只多了L39。
  1. --- examples/twisted/finger/finger06.cc 2010-08-29 00:14:33 +0800  
  2. +++ examples/twisted/finger/finger07.cc 2010-08-29 00:15:22 +0800  
  3. @@ -36,6 +36,7 @@  
  4. int main()  
  5. {  
  6. + users["schen"] = "Happy and well";  
  7. EventLoop loop;  
  8. TcpServer server(&loop, InetAddress(1079), "Finger");  
  9. server.setMessageCallback(onMessage);  
  10. server.start();  
  11. loop.loop();  

以上就是全部内容,可以用telnet(1) 扮演客户端来测试我们的简单finger 服务端。