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

陳碩的Blog

Muduo 網(wǎng)絡(luò)編程示例之零:前言

陳碩 (giantchen_AT_gmail)

Blog.csdn.net/Solstice

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

我將會(huì)寫一系列文章,介紹用 muduo 網(wǎng)絡(luò)庫(kù)完成常見的 TCP 網(wǎng)絡(luò)編程任務(wù)。目前計(jì)劃如下:

  1. UNP 中的簡(jiǎn)單協(xié)議,包括 echo、daytime、time、discard 等。 
  2. Boost.Asio 中的示例,包括 timer2~6、chat 等。
  3. Java Netty 中的示例,包括 discard、echo、uptime 等,其中的 discard 和 echo 帶流量統(tǒng)計(jì)功能。
  4. Python twisted 中的示例,包括 finger01~07
  5. 云風(fēng)的串并轉(zhuǎn)換連接服務(wù)器 multiplexer,包括單線程和多線程兩個(gè)版本。
  6. 用于測(cè)試兩臺(tái)機(jī)器的往返延遲的 roundtrip
  7. 用于測(cè)試兩臺(tái)機(jī)器的帶寬的 pingpong
  8. 文件傳輸
  9. 一個(gè)基于 TCP 的應(yīng)用層廣播 hub
  10. socks4a 代理服務(wù)器,包括簡(jiǎn)單的 TCP 中繼(relay)。
  11. 一個(gè) Sudoku 服務(wù)器的演變,從單線程到多線程,從阻塞到 event-based。
  12. 一個(gè)提供短址服務(wù)的 httpd 服務(wù)器

其中前面 7 個(gè)已經(jīng)放到了 muduo 代碼的 examples 目錄中,下載地址是: http://muduo.googlecode.com/files/muduo-0.1.5-alpha.tar.gz 

這些例子都比較簡(jiǎn)單,邏輯不復(fù)雜,代碼也很短,適合摘取關(guān)鍵部分放到博客上。其中一些有一定的代表性與針對(duì)性,比如“如何傳輸完整的文件”估計(jì)是網(wǎng)絡(luò)編程的初學(xué)者經(jīng)常遇到的問題。請(qǐng)注意,muduo 是設(shè)計(jì)來開發(fā)內(nèi)網(wǎng)的網(wǎng)絡(luò)程序,它沒有做任何安全方面的加強(qiáng)措施,如果用在公網(wǎng)上可能會(huì)受到攻擊,在后面的例子中我會(huì)談到這一點(diǎn)。

本系列文章適用于 Linux 2.6.x (x > 25),主要測(cè)試發(fā)行版為 Ubuntu 10.04 LTSDebian 6.0 Squeeze,64-bit x86 硬件。

TCP 網(wǎng)絡(luò)編程本質(zhì)論

我認(rèn)為,TCP 網(wǎng)絡(luò)編程最本質(zhì)的是處理三個(gè)半事件:

  1. 連接的建立,包括服務(wù)端接受 (accept) 新連接和客戶端成功發(fā)起 (connect) 連接。
  2. 連接的斷開,包括主動(dòng)斷開 (close 或 shutdown) 和被動(dòng)斷開 (read 返回 0)。
  3. 消息到達(dá),文件描述符可讀。這是最為重要的一個(gè)事件,對(duì)它的處理方式?jīng)Q定了網(wǎng)絡(luò)編程的風(fēng)格(阻塞還是非阻塞,如何處理分包,應(yīng)用層的緩沖如何設(shè)計(jì)等等)。
  4. 消息發(fā)送完畢,這算半個(gè)。對(duì)于低流量的服務(wù),可以不必關(guān)心這個(gè)事件;另外,這里“發(fā)送完畢”是指將數(shù)據(jù)寫入操作系統(tǒng)的緩沖區(qū),將由 TCP 協(xié)議棧負(fù)責(zé)數(shù)據(jù)的發(fā)送與重傳,不代表對(duì)方已經(jīng)收到數(shù)據(jù)。

這其中有很多難點(diǎn),也有很多細(xì)節(jié)需要注意,比方說:

  1. 如果要主動(dòng)關(guān)閉連接,如何保證對(duì)方已經(jīng)收到全部數(shù)據(jù)?如果應(yīng)用層有緩沖(這在非阻塞網(wǎng)絡(luò)編程中是必須的,見下文),那么如何保證先發(fā)送完緩沖區(qū)中的數(shù)據(jù),然后再斷開連接。直接調(diào)用 close(2) 恐怕是不行的。
  2. 如果主動(dòng)發(fā)起連接,但是對(duì)方主動(dòng)拒絕,如何定期 (帶 back-off) 重試?
  3. 非阻塞網(wǎng)絡(luò)編程該用邊沿觸發(fā)(edge trigger)還是電平觸發(fā)(level trigger)?(這兩個(gè)中文術(shù)語有其他譯法,我選擇了一個(gè)電子工程師熟悉的說法。)如果是電平觸發(fā),那么什么時(shí)候關(guān)注 EPOLLOUT 事件?會(huì)不會(huì)造成 busy-loop?如果是邊沿觸發(fā),如何防止漏讀造成的饑餓?epoll 一定比 poll 快嗎?
  4. 在非阻塞網(wǎng)絡(luò)編程中,為什么要使用應(yīng)用層緩沖區(qū)?假如一次讀到的數(shù)據(jù)不夠一個(gè)完整的數(shù)據(jù)包,那么這些已經(jīng)讀到的數(shù)據(jù)是不是應(yīng)該先暫存在某個(gè)地方,等剩余的數(shù)據(jù)收到之后再一并處理?見 lighttpd 關(guān)于 \r\n\r\n 分包的 bug。假如數(shù)據(jù)是一個(gè)字節(jié)一個(gè)字節(jié)地到達(dá),間隔 10ms,每個(gè)字節(jié)觸發(fā)一次文件描述符可讀 (readable) 事件,程序是否還能正常工作?lighttpd 在這個(gè)問題上出過安全漏洞
  5. 在非阻塞網(wǎng)絡(luò)編程中,如何設(shè)計(jì)并使用緩沖區(qū)?一方面我們希望減少系統(tǒng)調(diào)用,一次讀的數(shù)據(jù)越多越劃算,那么似乎應(yīng)該準(zhǔn)備一個(gè)大的緩沖區(qū)。另一方面,我們系統(tǒng)減少內(nèi)存占用。如果有 10k 個(gè)連接,每個(gè)連接一建立就分配 64k 的讀緩沖的話,將占用 640M 內(nèi)存,而大多數(shù)時(shí)候這些緩沖區(qū)的使用率很低。muduo 用 readv 結(jié)合棧上空間巧妙地解決了這個(gè)問題。
  6. 如果使用發(fā)送緩沖區(qū),萬一接收方處理緩慢,數(shù)據(jù)會(huì)不會(huì)一直堆積在發(fā)送方,造成內(nèi)存暴漲?如何做應(yīng)用層的流量控制?
  7. 如何設(shè)計(jì)并實(shí)現(xiàn)定時(shí)器?并使之與網(wǎng)絡(luò) IO 共用一個(gè)線程,以避免鎖。

這些問題在 muduo 的代碼中可以找到答案。

Muduo 簡(jiǎn)介

我編寫 Muduo 網(wǎng)絡(luò)庫(kù)的目的之一就是簡(jiǎn)化日常的 TCP 網(wǎng)絡(luò)編程,讓程序員能把精力集中在業(yè)務(wù)邏輯的實(shí)現(xiàn)上,而不要天天和 Sockets API 較勁。借用 Brooks 的話說,我希望 Muduo 能減少網(wǎng)絡(luò)編程中的偶發(fā)復(fù)雜性 (accidental complexity)。

Muduo 只支持 Linux 2.6.x 下的并發(fā)非阻塞 TCP 網(wǎng)絡(luò)編程,它的安裝方法見陳碩的 blog 文章

Muduo 的使用非常簡(jiǎn)單,不需要從指定的類派生,也不用覆寫虛函數(shù),只需要注冊(cè)幾個(gè)回調(diào)函數(shù)去處理前面提到的三個(gè)半事件就行了。

以經(jīng)典的 echo 回顯服務(wù)為例:

1. 定義 EchoServer class,不需要派生自任何基類:

 

 1 #ifndef MUDUO_EXAMPLES_SIMPLE_ECHO_ECHO_H 
 2 #define MUDUO_EXAMPLES_SIMPLE_ECHO_ECHO_H
 3 
 4 #include <muduo/net/TcpServer.h>
 5 
 6 // RFC 862 
 7 class EchoServer 
 8 
 9 public
10   EchoServer(muduo::net::EventLoop* loop, 
11              const muduo::net::InetAddress& listenAddr);
12 
13   void start();
14 
15 private
16   void onConnection(const muduo::net::TcpConnectionPtr& conn);
17 
18   void onMessage(const muduo::net::TcpConnectionPtr& conn, 
19                  muduo::net::Buffer* buf, 
20                  muduo::Timestamp time);
21 
22   muduo::net::EventLoop* loop_; 
23   muduo::net::TcpServer server_; 
24 };
25 
26 #endif  // MUDUO_EXAMPLES_SIMPLE_ECHO_ECHO_H
27 

 

在構(gòu)造函數(shù)里注冊(cè)回調(diào)函數(shù):

 

 1 EchoServer::EchoServer(EventLoop* loop, 
 2                        const InetAddress& listenAddr) 
 3   : loop_(loop), 
 4     server_(loop, listenAddr, "EchoServer"
 5 
 6   server_.setConnectionCallback( 
 7       boost::bind(&EchoServer::onConnection, this, _1)); 
 8   server_.setMessageCallback( 
 9       boost::bind(&EchoServer::onMessage, this, _1, _2, _3)); 
10 }
11 
12 void EchoServer::start() 
13 
14   server_.start(); 
15 
16 
17 

 

2. 實(shí)現(xiàn) EchoServer::onConnection() 和 EchoServer::onMessage():

 

 1 void EchoServer::onConnection(const TcpConnectionPtr& conn) 
 2 
 3   LOG_INFO << "EchoServer - " << conn->peerAddress().toHostPort() << " -> " 
 4     << conn->localAddress().toHostPort() << " is " 
 5     << (conn->connected() ? "UP" : "DOWN"); 
 6 }
 7 
 8 void EchoServer::onMessage(const TcpConnectionPtr& conn, 
 9                            Buffer* buf, 
10                            Timestamp time) 
11 
12   string msg(buf->retrieveAsString()); 
13   LOG_INFO << conn->name() << " echo " << msg.size() << " bytes at " << time.toString(); 
14   conn->send(msg); 
15 }
16 

 

3. 在 main() 里用 EventLoop 讓整個(gè)程序跑起來:

 

 1 #include "echo.h"
 2 
 3 #include <muduo/base/Logging.h> 
 4 #include <muduo/net/EventLoop.h>
 5 
 6 using namespace muduo; 
 7 using namespace muduo::net;
 8 
 9 int main() 
10 
11   LOG_INFO << "pid = " << getpid(); 
12   EventLoop loop; 
13   InetAddress listenAddr(2007); 
14   EchoServer server(&loop, listenAddr); 
15   server.start(); 
16   loop.loop(); 
17 }
18 

 

完整的代碼見 muduo/examples/simple/echo。
這個(gè)幾十行的小程序?qū)崿F(xiàn)了一個(gè)并發(fā)的 echo 服務(wù)程序,可以同時(shí)處理多個(gè)連接。
對(duì)這個(gè)程序的詳細(xì)分析見下一篇博客《Muduo 網(wǎng)絡(luò)編程示例之一:五個(gè)簡(jiǎn)單 TCP 協(xié)議》

(待續(xù))

posted on 2011-02-02 01:07 陳碩 閱讀(9397) 評(píng)論(0)  編輯 收藏 引用 所屬分類: muduo

<2014年3月>
2324252627281
2345678
9101112131415
16171819202122
23242526272829
303112345

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類

隨筆檔案

相冊(cè)

搜索

最新評(píng)論

閱讀排行榜

評(pí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>
            国产精品亚洲综合| 欧美成年人视频网站| 国产欧美韩日| 国产精品成人一区二区三区夜夜夜| 久久久久88色偷偷免费| 亚洲一区国产| 亚洲图色在线| 日韩性生活视频| 欧美激情网站在线观看| 欧美一级黄色录像| 久久久999精品免费| 亚洲国产天堂久久国产91| 国内精品国产成人| 国内精品久久久久久影视8| 国产一区二区你懂的| 韩国精品一区二区三区| 国产伦精品一区二区三区视频黑人| 欧美伦理a级免费电影| 久久嫩草精品久久久精品一| 乱码第一页成人| 久久色在线观看| 欧美二区在线看| 欧美视频精品在线| 韩国欧美国产1区| 新片速递亚洲合集欧美合集| 久久久久综合网| 欧美成人精品激情在线观看| 欧美日韩国产美女| 欧美性一二三区| 国产一区二区三区电影在线观看| 韩国av一区二区三区| 亚洲精品久久| 国产精品理论片| 国产一区二区精品久久91| 亚洲精品韩国| 久久国产精品免费一区| 老巨人导航500精品| 嫩草成人www欧美| 欧美色图一区二区三区| 国产自产在线视频一区| 日韩亚洲欧美一区二区三区| 欧美中文字幕| 香蕉久久国产| 亚洲国产精彩中文乱码av在线播放| 欧美激情综合| 国产精品久久一级| 国产精品男人爽免费视频1 | 亚洲人成欧美中文字幕| 中文精品视频| 欧美成人国产一区二区| 亚洲一本大道在线| 欧美成人午夜激情在线| 黄色日韩网站视频| 午夜视黄欧洲亚洲| 欧美国产视频日韩| 欧美一区二区成人6969| 欧美人牲a欧美精品| 欧美精品久久99| 亚洲人成人一区二区在线观看 | 99精品国产在热久久婷婷| 亚洲在线一区二区三区| 牛牛精品成人免费视频| 亚洲综合日韩中文字幕v在线| 欧美成人精品福利| 在线国产日韩| 另类天堂av| 欧美一区二区三区视频免费播放| 欧美日韩国产一区二区| 亚洲高清资源综合久久精品| 国产欧美1区2区3区| 亚洲少妇自拍| 亚洲国产日韩欧美一区二区三区| 欧美在线观看网站| 国产三区二区一区久久| 亚洲欧美日韩国产成人| 久久er精品视频| 亚洲免费视频一区二区| 国产精品免费观看在线| 午夜精品美女久久久久av福利| 日韩一区二区免费高清| 欧美日韩国语| 欧美在线日韩在线| 亚洲欧美日韩区| 媚黑女一区二区| 欧美淫片网站| 亚洲精品一区二区三区福利| 91久久国产综合久久蜜月精品 | 欧美阿v一级看视频| 亚洲欧美日韩在线高清直播| 国产午夜精品全部视频在线播放| 久久躁狠狠躁夜夜爽| 欧美高清视频| 亚洲欧美国产高清| 久久久久国产精品午夜一区| 亚洲美女中文字幕| 亚洲免费黄色| 国产精品综合色区在线观看| 老司机一区二区三区| 欧美黄色片免费观看| 欧美伊久线香蕉线新在线| 久久久久久久性| 亚洲图片在线观看| 亚洲综合成人婷婷小说| 国产欧美日韩视频在线观看 | 欧美日韩另类丝袜其他| 亚洲开发第一视频在线播放| 久久一日本道色综合久久| 欧美激情国产日韩| 久久国产精品免费一区| 一本色道久久88精品综合| 毛片基地黄久久久久久天堂| 国产日韩精品视频一区| 亚洲欧美久久久久一区二区三区| 久久成人免费| 欧美激情成人在线视频| 久久久久久久性| 欧美日韩亚洲国产一区| 亚洲国产精品久久91精品| 一区二区三区不卡视频在线观看 | 久久久久中文| 国产精品人人做人人爽| 亚洲一区中文| 亚洲一区二区三区在线看| 国产精品推荐精品| 亚洲国产成人在线播放| 亚洲国产午夜| 欧美精品粉嫩高潮一区二区| 99日韩精品| 久久免费视频这里只有精品| 精品动漫av| 99re视频这里只有精品| 亚洲日本成人| 欧美视频在线观看一区| 午夜日韩在线| 久久黄色级2电影| 亚洲成人直播| 午夜亚洲激情| 久久婷婷丁香| 久久福利资源站| 亚洲国产成人精品女人久久久 | 黄色av日韩| 在线观看日韩av电影| 日韩天天综合| 国产精品久久国产精麻豆99网站| 日韩午夜在线电影| 欧美激情黄色片| 99re66热这里只有精品4| 免费不卡在线视频| 亚洲欧洲日本mm| 欧美国产视频一区二区| 一本久久青青| 欧美日韩免费观看一区| 久久成人人人人精品欧| 国产欧美一区二区视频| 亚洲国产毛片完整版| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲精品久久久久久久久久久久久 | 欧美日本亚洲| 欧美日韩在线三区| 亚洲系列中文字幕| 欧美国产精品v| 亚洲精品乱码久久久久| 亚洲第一搞黄网站| 日韩亚洲成人av在线| 亚洲香蕉视频| 久久精品一区二区三区不卡牛牛| 99综合视频| 国产麻豆日韩| 亚洲图片欧美午夜| 99热免费精品| 国产亚洲a∨片在线观看| 欧美福利在线| 亚洲综合99| 亚洲国产另类久久精品| 欧美一区二区三区四区高清 | 亚洲视频国产视频| 国产老肥熟一区二区三区| 亚洲人成在线免费观看| 在线播放日韩| 欧美在线日韩在线| 午夜精品久久| 国产精品igao视频网网址不卡日韩| 久久视频在线看| 欧美性做爰猛烈叫床潮| 欧美国产激情| 久久精品最新地址| 国产精品你懂的在线| 亚洲国产精品一区二区www在线| 国产一区美女| 亚洲高清不卡在线| 久久久久久亚洲精品杨幂换脸| 欧美日韩精品综合在线| 91久久久久久久久| 亚洲精品无人区| 久久久国产精品一区二区三区| 欧美性猛交xxxx免费看久久久| 亚洲国产裸拍裸体视频在线观看乱了中文 | 日韩一区二区福利| 久久这里只有| 国产精品尤物|