青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

陳碩的Blog

Muduo 網絡編程示例之四:Twisted Finger

陳碩 (giantchen_AT_gmail)

Blog.csdn.net/Solstice

這是《Muduo 網絡編程示例》系列的第四篇文章。

Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category/779646.aspx

Python Twisted 是一款非常好的網絡庫,它也采用 Reactor 作為網絡編程的基本模型,所以從使用上與 muduo 頗有相似之處。(當然,muduo 沒有 deferreds)Finger 是 twisted 文檔的一個經典例子,本文展示如何用 muduo 來實現最簡單的 finger 服務端。限于篇幅,只實現 finger01~07。代碼位于 examples/twisted/finger

1 拒絕連接

什么都不做,程序空等。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: }

2 接受新連接

在 1079 端口偵聽新連接,接受連接之后什么都不做,程序空等。muduo 會自動丟棄收到的數據。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: }

3 主動斷開連接

接受新連接之后主動斷開。finger03.cc

以下省略頭文件和 namespace。

   1: void onConnection(const TcpConnectionPtr& conn)
   2: {
   3:   if (conn->connected())
   4:   {
   5:     conn->shutdown();
   6:   }
   7: }
   8:  
   9: int main()
  10: {
  11:   EventLoop loop;
  12:   TcpServer server(&loop, InetAddress(1079), "Finger");
  13:   server.setConnectionCallback(onConnection);
  14:   server.start();
  15:   loop.loop();
  16: }

4 讀取用戶名,然后斷開連接

如果讀到一行以 \r\n 結尾的消息,就斷開連接。finger04.cc

注意這段代碼有安全問題,如果惡意客戶端不斷發送數據而不換行,會撐爆服務端的內存。另外,Buffer::findCRLF() 是線性查找,如果客戶端每次發一個字節,服務端的時間復雜度為 O(N^2),會消耗 CPU 資源。

   1: void onMessage(const TcpConnectionPtr& conn,
   2:                Buffer* buf,
   3:                Timestamp receiveTime)
   4: {
   5:   if (buf->findCRLF())
   6:   {
   7:     conn->shutdown();
   8:   }
   9: }
  10:  
  11: int main()
  12: {
  13:   EventLoop loop;
  14:   TcpServer server(&loop, InetAddress(1079), "Finger");
  15:   server.setMessageCallback(onMessage);
  16:   server.start();
  17:   loop.loop();
  18: }

5. 讀取用戶名、輸出錯誤信息、然后斷開連接

如果讀到一行以 \r\n 結尾的消息,就發送一條出錯信息,然后斷開連接。finger05.cc

安全問題同上。

   1: void onMessage(const TcpConnectionPtr& conn,
   2:                Buffer* buf,
   3:                Timestamp receiveTime)
   4: {
   5:   if (buf->findCRLF())
   6:   {
   7:     conn->send("No such user\r\n");
   8:     conn->shutdown();
   9:   }
  10: }
  11:  
  12: int main()
  13: {
  14:   EventLoop loop;
  15:   TcpServer server(&loop, InetAddress(1079), "Finger");
  16:   server.setMessageCallback(onMessage);
  17:   server.start();
  18:   loop.loop();
  19: }

6. 從空的 UserMap 里查找用戶

從一行消息中拿到用戶名(第 22 行),在 UserMap 里查找,然后返回結果。finger06.cc

安全問題同上。

   1: typedef std::map<string, string> UserMap;
   2: UserMap users;
   3:  
   4: string getUser(const string& user)
   5: {
   6:   string result = "No such user";
   7:   UserMap::iterator it = users.find(user);
   8:   if (it != users.end())
   9:   {
  10:     result = it->second;
  11:   }
  12:   return result;
  13: }
  14:  
  15: void onMessage(const TcpConnectionPtr& conn,
  16:                Buffer* buf,
  17:                Timestamp receiveTime)
  18: {
  19:   const char* crlf = buf->findCRLF();
  20:   if (crlf)
  21:   {
  22:     string user(buf->peek(), crlf);
  23:     conn->send(getUser(user) + "\r\n");
  24:     buf->retrieveUntil(crlf + 2);
  25:     conn->shutdown();
  26:   }
  27: }
  28:  
  29: int main()
  30: {
  31:   EventLoop loop;
  32:   TcpServer server(&loop, InetAddress(1079), "Finger");
  33:   server.setMessageCallback(onMessage);
  34:   server.start();
  35:   loop.loop();
  36: }

7. 往 UserMap 里添加一個用戶

與前面幾乎完全一樣,只多了第 31 行。finger07.cc

   1: typedef std::map<string, string> UserMap;
   2: UserMap users;
   3:  
   4: string getUser(const string& user)
   5: {
   6:   string result = "No such user";
   7:   UserMap::iterator it = users.find(user);
   8:   if (it != users.end())
   9:   {
  10:     result = it->second;
  11:   }
  12:   return result;
  13: }
  14:  
  15: void onMessage(const TcpConnectionPtr& conn,
  16:                Buffer* buf,
  17:                Timestamp receiveTime)
  18: {
  19:   const char* crlf = buf->findCRLF();
  20:   if (crlf)
  21:   {
  22:     string user(buf->peek(), crlf);
  23:     conn->send(getUser(user) + "\r\n");
  24:     buf->retrieveUntil(crlf + 2);
  25:     conn->shutdown();
  26:   }
  27: }
  28:  
  29: int main()
  30: {
  31:   users["schen"] = "Happy and well";
  32:   EventLoop loop;
  33:   TcpServer server(&loop, InetAddress(1079), "Finger");
  34:   server.setMessageCallback(onMessage);
  35:   server.start();
  36:   loop.loop();
  37: }

以上就是全部內容,可以用 telnet 扮演客戶端來測試我們的簡單 finger 服務端。

Telnet 測試

在一個命令行窗口運行

$ ./bin/twisted_finger07

另一個命令行運行

$ telnet localhost 1079
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
muduo
No such user
Connection closed by foreign host.

再試一次

$ telnet localhost 1079
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
schen
Happy and well
Connection closed by foreign host.

冒煙測試過關。

(待續)

posted on 2011-02-23 21:33 陳碩 閱讀(2400) 評論(0)  編輯 收藏 引用 所屬分類: muduo

<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

導航

統計

常用鏈接

隨筆分類

隨筆檔案

相冊

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久五月激情| 久久久综合香蕉尹人综合网| 日韩午夜高潮| 亚洲一区高清| 激情丁香综合| 欧美专区亚洲专区| 国产伦理一区| 在线亚洲欧美视频| 欧美在线观看你懂的| 亚洲手机成人高清视频| 欧美大色视频| 在线日本欧美| 国产精品美腿一区在线看| 亚洲免费电影在线| 欧美日本韩国一区| 亚洲精品乱码久久久久久日本蜜臀 | 久久精品欧美| 亚洲高清一区二区三区| 国产精品av一区二区| 久久精品二区三区| 99在线精品视频在线观看| 久久免费视频这里只有精品| 久久久亚洲精品一区二区三区| 久久久亚洲人| 亚洲一区综合| 亚洲小少妇裸体bbw| 亚洲国产日韩精品| 欧美福利网址| 欧美激情第三页| 亚洲国产99| 亚洲久色影视| 久久精品国产第一区二区三区| 性欧美xxxx大乳国产app| 亚洲黄网站黄| 9人人澡人人爽人人精品| 久久成人精品| 国产一区观看| 在线观看日韩专区| 在线不卡a资源高清| 欧美一区二区国产| 久久婷婷麻豆| 欧美一区二区三区免费观看视频| 亚洲无线一线二线三线区别av| 久久久久久久久久久久久久一区 | 亚洲欧美另类久久久精品2019| 亚洲电影免费观看高清完整版在线 | 亚洲精品中文字幕在线| 欧美国产视频在线观看| 麻豆成人在线播放| 欧美日韩99| 激情欧美一区二区三区| 久久久久久久999精品视频| 亚洲激情中文1区| 欧美日韩国产欧美日美国产精品| 亚洲最新合集| 欧美风情在线观看| 欧美精品在线视频| 久久www免费人成看片高清| 一区二区三区精品视频| 亚洲毛片网站| 在线观看久久av| 99这里只有久久精品视频| 国产乱肥老妇国产一区二 | 亚洲高清在线观看| 亚洲一本大道在线| 亚洲第一偷拍| 午夜精品婷婷| 亚洲性夜色噜噜噜7777| 欧美成人亚洲成人| 欧美激情偷拍| 国产精品欧美日韩一区| 日韩系列欧美系列| 亚洲欧洲视频| 在线精品国产欧美| 亚洲欧美日韩一区在线| 国内精品99| 亚洲一区激情| 亚洲在线视频| 国产日韩欧美一区在线 | 在线综合视频| 欧美电影在线观看完整版| 久久精品视频va| 国内精品久久久久久| 午夜精品一区二区三区在线视| 亚洲网站视频| 国产精品久久久久影院色老大| 亚洲人成网站777色婷婷| 亚洲高清视频一区二区| 欧美激情亚洲自拍| 99视频精品在线| 亚洲国产欧美精品| 一色屋精品视频在线看| 另类春色校园亚洲| 欧美在线播放| 一区二区三区在线观看欧美| 久久综合久久综合久久综合| 免费精品99久久国产综合精品| 欧美日韩人人澡狠狠躁视频| 久久精品视频在线免费观看| 国产一区二区高清| 亚洲高清视频中文字幕| 在线视频欧美一区| 精品99视频| 国产精品久久毛片a| 午夜精品视频网站| 日韩亚洲成人av在线| 老巨人导航500精品| 午夜宅男久久久| 国内自拍一区| 午夜欧美不卡精品aaaaa| 欧美激情第五页| 最新日韩在线| 午夜老司机精品| 一区二区三区视频在线| 狠狠色狠狠色综合| 国产在线日韩| 国产视频一区二区三区在线观看| 欧美激情综合网| 蜜臀a∨国产成人精品| 久久久中精品2020中文| 欧美影院一区| 久久日韩粉嫩一区二区三区| 你懂的成人av| 亚洲视频一区| 亚洲图中文字幕| 亚洲私拍自拍| 欧美在线资源| 欧美成人综合网站| 国产精品欧美精品| 欧美日韩精品免费在线观看视频| 欧美电影美腿模特1979在线看 | 一区在线播放视频| 黑人操亚洲美女惩罚| 亚洲国产精品悠悠久久琪琪 | 亚洲国产精品一区二区久| 亚洲成人中文| 久久国产一区二区| 欧美激情第二页| 亚洲午夜未删减在线观看| 欧美一区二区三区四区在线| 午夜久久一区| 国产精品家庭影院| 欧美日韩一区二区高清| 欧美天天视频| 国产精品成人播放| 国内精品久久国产| 亚洲影院免费| 欧美成人午夜77777| 午夜精品www| 欧美日韩精品伦理作品在线免费观看 | 欧美主播一区二区三区美女 久久精品人| 久久99在线观看| 日韩亚洲精品视频| 狂野欧美一区| 国内精品免费在线观看| 亚洲一级黄色av| 亚洲日本中文| 欧美成人激情在线| 在线观看欧美成人| 免费一级欧美片在线观看| 亚洲欧美中文字幕| 国产精品中文字幕欧美| 亚洲欧美在线免费| 香蕉成人啪国产精品视频综合网| 久久久噜久噜久久综合| 一二三区精品| 久久国产日韩| 激情久久久久久久| 欧美成人精品在线观看| 欧美国产三区| 欧美一区二区播放| 欧美一区二区三区四区视频| 国产午夜亚洲精品不卡| 久久亚洲综合色| 欧美成人精精品一区二区频| 亚洲精品久久久久| 亚洲欧美国产日韩天堂区| 亚洲伦理在线免费看| 午夜亚洲一区| 日韩视频久久| 午夜精品久久久久久久| 狠狠噜噜久久| 中国女人久久久| 久久只精品国产| 亚洲欧美美女| 欧美国产日韩一区| 久久久噜噜噜久久中文字幕色伊伊| 久久全国免费视频| 亚洲欧美日韩国产| 欧美激情二区三区| 麻豆久久久9性大片| 国产日韩欧美成人| 亚洲一区国产精品| 午夜激情综合网| 国产精品成人观看视频免费| 亚洲国产婷婷香蕉久久久久久| 国产综合色产在线精品| 欧美在线播放一区| 蜜桃av噜噜一区| 亚洲青涩在线|