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

陳碩的Blog

Muduo 網(wǎng)絡(luò)編程示例之四:Twisted Finger

陳碩 (giantchen_AT_gmail)

Blog.csdn.net/Solstice

這是《Muduo 網(wǎng)絡(luò)編程示例》系列的第四篇文章。

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

Python Twisted 是一款非常好的網(wǎng)絡(luò)庫,它也采用 Reactor 作為網(wǎng)絡(luò)編程的基本模型,所以從使用上與 muduo 頗有相似之處。(當然,muduo 沒有 deferreds)Finger 是 twisted 文檔的一個經(jīng)典例子,本文展示如何用 muduo 來實現(xiàn)最簡單的 finger 服務(wù)端。限于篇幅,只實現(xiàn) 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 會自動丟棄收到的數(shù)據(jù)。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 結(jié)尾的消息,就斷開連接。finger04.cc

注意這段代碼有安全問題,如果惡意客戶端不斷發(fā)送數(shù)據(jù)而不換行,會撐爆服務(wù)端的內(nèi)存。另外,Buffer::findCRLF() 是線性查找,如果客戶端每次發(fā)一個字節(jié),服務(wù)端的時間復(fù)雜度為 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 結(jié)尾的消息,就發(fā)送一條出錯信息,然后斷開連接。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 里查找,然后返回結(jié)果。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: }

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

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.

冒煙測試過關(guān)。

(待續(xù))

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

<2011年2月>
303112345
6789101112
13141516171819
20212223242526
272812345
6789101112

導(dǎo)航

統(tǒng)計

常用鏈接

隨筆分類

隨筆檔案

相冊

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久精品一区二区三区四区| 久久永久免费| 欧美成人情趣视频| 欧美一级一区| 欧美一区二区在线| 久久九九热免费视频| 久久九九国产精品| 久久久五月婷婷| 久久天堂精品| 欧美jizz19hd性欧美| 六月天综合网| 欧美精品在线网站| 国产精品久久久久一区二区三区| 欧美视频福利| 国产综合久久| 日韩一级大片在线| 西西裸体人体做爰大胆久久久| 亚洲女同在线| 久久五月天婷婷| 午夜精品视频一区| 欧美在线三级| 欧美激情精品久久久| 亚洲国产精品福利| 国语自产精品视频在线看| 国内精品免费午夜毛片| 亚洲国产成人高清精品| 一区二区三区蜜桃网| 久久裸体艺术| 一区二区三区 在线观看视| 欧美亚洲网站| 国产精品久久久久久久久久ktv | 久久riav二区三区| 免费在线亚洲| 亚洲午夜在线观看视频在线| 鲁鲁狠狠狠7777一区二区| 国产精品久久久久77777| 亚洲国产三级网| 久久久精品性| 亚洲性线免费观看视频成熟| 麻豆精品视频| 国外成人在线视频| 欧美亚洲一区二区在线观看| 欧美福利视频网站| 欧美在线三区| 国产精品观看| 亚洲美女视频在线观看| 免费欧美视频| 久久av资源网站| 国产伦精品一区二区三区免费| 亚洲靠逼com| 欧美激情一区二区在线| 欧美一区二区三区在线免费观看 | 一区二区三区精密机械公司| 亚洲精品小视频| 久久免费精品视频| 欧美日韩久久精品| 夜久久久久久| 欧美成人午夜77777| 亚洲一区二区视频| 欧美波霸影院| 在线观看日韩av先锋影音电影院| 宅男噜噜噜66一区二区| 欧美高清视频一区二区| 亚洲免费一区二区| 欧美日韩人人澡狠狠躁视频| 亚洲国产日韩欧美综合久久| 亚洲天天影视| 91久久精品日日躁夜夜躁国产| 欧美在线观看你懂的| 国产精品成人免费| 亚洲免费观看在线观看| 牛牛精品成人免费视频| 亚洲在线视频免费观看| 欧美与黑人午夜性猛交久久久| 欧美成人免费全部观看天天性色| 欧美在线视屏| 亚洲视频第一页| 欧美成人资源| 欧美色视频日本高清在线观看| 亚洲一卡二卡三卡四卡五卡| 亚洲精品久久嫩草网站秘色 | 中文av一区二区| 亚洲国产成人tv| 欧美国产日韩视频| 日韩一区二区久久| 亚洲精品日本| 欧美三级视频在线| 亚洲国产第一| 欧美黑人多人双交| 欧美sm视频| 日韩视频一区二区在线观看| 亚洲国产乱码最新视频| 欧美激情视频在线播放| 一二三区精品| 亚洲一区二区三区午夜| 国产伦精品一区二区三区视频黑人 | 亚洲国产欧美一区二区三区同亚洲 | 午夜日韩福利| 欧美专区亚洲专区| 在线观看免费视频综合| 亚洲第一精品久久忘忧草社区| 欧美mv日韩mv国产网站| 亚洲精品乱码久久久久久蜜桃91| 亚洲国产精品久久久久秋霞影院 | 香蕉国产精品偷在线观看不卡| 亚洲女人av| 亚洲国产成人在线播放| 999在线观看精品免费不卡网站| 国产精品免费一区豆花| 久久久久久久综合| 欧美国产在线观看| 中文日韩在线视频| 欧美一区在线直播| 亚洲欧洲精品一区二区三区不卡| 艳妇臀荡乳欲伦亚洲一区| 国产色产综合产在线视频| 欧美成人精品在线播放| 欧美成人69av| 亚洲免费视频中文字幕| 久久久综合激的五月天| 亚洲午夜av电影| 午夜国产一区| 亚洲美女在线国产| 亚洲欧美中文日韩在线| 国产人成精品一区二区三| 久久一区二区三区四区| 欧美日韩一区二区三区免费| 久久午夜视频| 国产精品久久久久天堂| 欧美成人精品在线观看| 国产精品男gay被猛男狂揉视频| 欧美成人久久| 国产亚洲日本欧美韩国| 91久久精品国产91久久性色tv| 国产精品一页| 亚洲精选一区| 亚洲国产一区二区三区高清| 小黄鸭精品密入口导航| 影音先锋中文字幕一区二区| 亚洲色图综合久久| 午夜精品福利在线观看| 亚洲国产精品电影在线观看| 亚洲制服av| 亚洲欧美日本国产有色| 欧美日本高清视频| 亚洲第一区在线观看| 在线看成人片| 久久久精品tv| 久久一区视频| 国内精品亚洲| 99国产精品99久久久久久粉嫩| 一本色道久久加勒比88综合| 麻豆国产精品777777在线| 久久精品人人做人人爽电影蜜月 | 欧美日韩一区二区三区免费看 | 久久精品色图| 欧美精品在线免费播放| 亚洲精品1区2区| 欧美日韩一区二区视频在线观看| 国产精品va在线播放| 欧美bbbxxxxx| 国模私拍视频一区| 久久aⅴ乱码一区二区三区| 午夜精品电影| 欧美日一区二区三区在线观看国产免| 亚洲激情偷拍| 亚洲开发第一视频在线播放| 欧美成人国产一区二区| 亚洲成人在线网| aa级大片欧美三级| 欧美视频免费在线观看| 亚洲尤物在线视频观看| 久久激情综合网| 今天的高清视频免费播放成人| 欧美在线视频观看免费网站| 久久视频在线看| 亚洲第一主播视频| 欧美激情第3页| aaa亚洲精品一二三区| 麻豆精品视频在线| 在线亚洲一区观看| 国产精品久久久久久亚洲调教| 亚洲一区影音先锋| 亚洲美女视频在线观看| 亚洲视频一二区| 国产欧美日韩一区二区三区在线| 亚洲一区二区三区影院| 久久久久久久尹人综合网亚洲| 伊人婷婷久久| 欧美三级午夜理伦三级中视频| 午夜视频一区在线观看| 亚洲第一天堂无码专区| 亚洲综合色自拍一区| 一区二区三区中文在线观看| 欧美成人一二三| 亚洲成色www久久网站| 久久免费视频一区| 日韩午夜三级在线| 国产色爱av资源综合区| 欧美激情第8页|