6.4.3 七步实现finger 服务(2)
5. 读取用户名、输出错误信息,然后断开连接。如果读到一行以\r\n 结尾的消息,就发送一条出错信息,然后断开连接。安全问题同上。
- --- examples/twisted/finger/finger04.cc 2010-08-29 00:03:14 +0800
- +++ examples/twisted/finger/finger05.cc 2010-08-29 00:06:05 +0800
- @@ -7,12 +7,13 @@
- void onMessage(const TcpConnectionPtr& conn,
- Buffer* buf,
- Timestamp receiveTime)
- {
- if (buf->findCRLF())
- {
- + conn->send("No such user\r\n");
- conn->shutdown();
- }
- }
6. 从空的UserMap 里查找用户。从一行消息中拿到用户名(L30),在UserMap里查找,然后返回结果。安全问题同上。 - examples/twisted/finger/finger06.cc
- 9 typedef std::map<string, string> UserMap;
- 10 UserMap users;
- 11
- 12 string getUser(const string& user)
- 13 {
- 14 string result = "No such user";
- 15 UserMap::iterator it = users.find(user);
- 16 if (it != users.end())
- 17 {
- 18 result = it->second;
- 19 }
- 20 return result;
- 21 }
- 22
- 23 void onMessage(const TcpConnectionPtr& conn,
- 24 Buffer* buf,
- 25 Timestamp receiveTime)
- 26 {
- 27 const char* crlf = buf->findCRLF();
- 28 if (crlf)
- 29 {
- 30 string user(buf->peek(), crlf);
- 31 conn->send(getUser(user) + "\r\n");
- 32 buf->retrieveUntil(crlf + 2);
- 33 conn->shutdown();
- 34 }
- 35 }
- 36
- 37 int main()
- 38 {
- 39 EventLoop loop;
- 40 TcpServer server(&loop, InetAddress(1079), "Finger");
- 41 server.setMessageCallback(onMessage);
- 42 server.start();
- 43 loop.loop();
- 44 }
- examples/twisted/finger/finger06.cc
7. 往UserMap 里添加一个用户。与前面几乎完全一样,只多了L39。- --- examples/twisted/finger/finger06.cc 2010-08-29 00:14:33 +0800
- +++ examples/twisted/finger/finger07.cc 2010-08-29 00:15:22 +0800
- @@ -36,6 +36,7 @@
- int main()
- {
- + users["schen"] = "Happy and well";
- EventLoop loop;
- TcpServer server(&loop, InetAddress(1079), "Finger");
- server.setMessageCallback(onMessage);
- server.start();
- loop.loop();
- }
以上就是全部内容,可以用telnet(1) 扮演客户端来测试我们的简单finger 服务端。