天天看點

Muduo 網絡程式設計示例之十:socks4a 代理伺服器TCP 中繼器Socks4a 代理伺服器n:1 與 1:n 連接配接轉發Muduo 程式設計示例系列告一段落接下來的計劃

Muduo 網絡程式設計示例之十:socks4a 代理伺服器

陳碩 (giantchen_AT_gmail)

Blog.csdn.net/Solstice  t.sina.com.cn/giantchen

在實作 socks4a proxy 之前,我們先寫一個功能更簡單的網絡程式—— TCP 中繼器 (TCP relay),或者叫做窮人的 tcpdump (poor man's tcpdump)。

一般情況下,用戶端程式直接連接配接服務端,如下圖。有時候,我們想在 client 和 server 之間放一個中繼器 (relay),把 client 與 server 之間的通信内容記錄下來。這時用 tcpdump 是最友善省事的,但是 tcpdump 需要 root 權限,萬一沒有 root 密碼呢?窮人有窮人的辦法,自己寫一個 relay,讓 client 連接配接 relay,再讓 relay 連接配接 server,如下圖中的 T 型結構,relay 扮演了類似 proxy 的角色。

TcpRelay 是我們自己寫的,可以動動手腳。除了記錄通信内容,還可以制造延時,或者故意翻轉 1 bit 資料以模拟 router 硬體故障。

TcpRelay 的功能(業務邏輯)看上去很簡單,無非是把連接配接 C 上收到的資料發給連接配接 S,同時把連接配接 S 上收到的資料發給連接配接 C。但仔細考慮起來,細節其實不那麼簡單:

建立連接配接。為了真實模拟 client,TcpRelay 在 accept 連接配接 C 之後才向 server 發起連接配接 S,那麼在 S 建立起來之前,從 C 收到資料怎麼辦?要不要暫存起來?

并發連接配接的管理。上圖中隻畫出了一個 client,實際上 TcpRelay 可以服務多個 clients,左右兩邊這些并發連接配接如何管理,如何防止串話(cross talk)?

連接配接斷開。Client 和 Server 都可能主動斷開連接配接。當 Client 主動斷開連接配接 C 時,TcpRelay 應該立刻斷開 S。當 Server 主動斷開連接配接 S 時,TcpRelay 應立刻斷開 C。這樣才能比較精确地模拟 Client 和 Server 的行為。在關閉連接配接的刹那,又有新的 client 連接配接進來,複用了剛剛 close 的 fd 号碼,會不會造成串話? 萬一 Client 和 Server 幾乎同時主動斷開連接配接,TcpRelay 如何應對?

速度不比對。如果連接配接 C 的帶寬是 100KB/s,而連接配接 S 的帶寬是 10MB/s,不巧 Server 是個 chargen 服務,會全速發送資料,那麼會不會撐爆 TcpRelay 的 buffer?如何限速?特别是在使用 non-blocking IO 和 level-trigger polling 的時候如何限制讀取資料的速度?

在看 muduo 的實作之前,請讀者思考:如果用 Sockets API 來實作 TcpRelay,如何解決以上這些問題。

Socks4a 的功能與 TcpRelay 非常相似,也是把連接配接 C 上收到的資料發給連接配接 S,同時把連接配接 S 上收到的資料發給連接配接 C。它與 TcpRelay 的差別在于,TcpRelay 固定連到某個 server 位址,而 socks4a 允許 client 指定要連哪個 server。在 accept 連接配接 C 之後,Socks4a server 會讀幾個位元組,以了解 server 的位址,再發起連接配接 S。

muduo 這個 socks4a 是個标準的網絡服務,可以供 Web 浏覽器使用(我正是這麼測試它的)。

我仿照他的思路,用 muduo 實作了這三個程式。不同的是,我沒有做資料混淆,是以不能用來翻傳說中的牆。

socks 代理服務正是本文實作的 socks4a。

有興趣的讀者可以把這三個程式級聯起來試一試。

這個系列基本涵蓋了 muduo 為編寫單線程服務端和用戶端 TCP 網絡程式提供的功能,muduo 的能力不止于此:

多線程,muduo::net::TcpServer 内置了一個簡單但适應性很強的線程模型。目前部落格上的例子涉及的業務邏輯很簡單,沒有複雜的運算,瓶頸通常在 IO 上,多線程的優勢發揮不出來。

進階應用。比方說用 muduo::net::Channel 配合 signalfd 來處理信号;其他非阻塞網絡用戶端庫(例如 ZooKeeper 的 C 用戶端,PostgreSQL 的用戶端 libpq)與 muduo EventLoop 的內建。

以上兩點在以後的文章裡會提及,不會明珠暗藏。

接下來,我還會寫一系列部落格,目前想到的有:

談一談我的網絡程式設計學習經驗。文章已經完成大半,端午節之後可以釋出。

用 muduo 實作一些稍微複雜一些的網絡程式,比如小規模的分布式系統。計劃有:利用 Paxos 算法實作一個高可用的 in-memory key value 存儲,在此基礎上實作 naming service,然後實作我以前多次提到的簡單機群管理系統等等。目前 muduo 的示例程式都是簡單獨立的網絡程式,下半年我想多寫一寫由多個程式組成的系統,具體談一談分布式系統細節設計。

    本文轉自 陳碩  部落格園部落格,原文連結:http://www.cnblogs.com/Solstice/archive/2011/06/02/2070060.html,如需轉載請自行聯系原作者

上一篇: 恢複盤
下一篇: 找檔案

繼續閱讀