嗯,近期都在網易遊戲實習,因此貌似有段時間沒有上來寫點東西了。。。node
來網易遊戲實習最基本的目的事實上就是想知道在遊戲公司裏面工做都是些什麼內容,畢竟本身曾經也沒有接觸過遊戲公司。。python
還比較的好奇。。linux
。c++
曾經可能認爲遊戲公司各類高大上吧。作的工做各類有意思。git
。現在看來應該也不是這樣子的,畢竟大多數時間應該仍是在寫遊戲的邏輯代碼了。。github
。編程
挺奇怪的。網絡
。socket
。感受盡管在遊戲公司實習。但是作的事情仍是本身的老本行。tcp
。。因爲要用python開發一個server的監控系統。而且有提出要監控某個指定進程所佔用的網絡帶寬的狀況。
。。嗯。
。
找來找去python沒有現成的東西來作這件事情。
。而且自己可以用的東西都比較少。
。。
只是卻是找到了相似的東西。
。。nethogs。
。
。
一個專門用於linux下監控各個進程的網絡帶寬的程序。
。。
因此就直接看了下他的代碼實現。
。
。代碼不是很是多吧。。
。c++寫的。
。。而且很是easy。。。這裏就不詳細的說這部分的代碼了。。。直接來講一下功能實現的原理吧。。
。。
嗯,比較重要的一個文件夾:/proc
嗯。事實上它是一個僞文件夾吧,因爲它並不存在於實實在在的文件系統其中。而是一個執行時建立的文件夾。而且保存的信息也都是一些執行時的信息,好比進程信息,網絡鏈接信息什麼的。。。
好,現在若是咱們有一個進程,它的PID 是 7140。那麼咱們可以進入例如如下文件夾:
/proc/7140/fd
事實上這裏看名字就大概能夠猜到這個文件夾下保存的都是什麼數據吧:當前進程所打開的文件描寫敘述符。。。例如如下圖:
嗯。這個應該很是熟悉吧。。。略微瞭解一點linux如下編程的就應該知道,在程序中,咱們的socket,或者打開文件都是相應着一個文件描寫敘述符。那麼上述的文件夾中就保存了咱們程序執行中文件描寫敘述符的狀況。。而後這些事實上又都是連接,終於鏈接到一個inode上面。。。在這裏可以看到咱們兩個socket都相應着23045以及23046這兩個inode。
。。
。
那麼咱們怎樣在找到上述這兩個socket的詳細的信息呢。。。
?
嗯。在終端輸入例如如下命令:cat /proc/net/tcp
咱們可以獲得的輸出例如如下圖:
這裏就是當前本機所創建的所有的tcp的信息。
。。
ip地址,port啥的。。
。最後咱們還可以看到一個項目:inode。
。。也就是這個連接它所關聯的inode。。。
到這裏就應該能夠將前面所示進程的文件描寫敘述符與它詳細的連接信息相應起來了吧。。。
好啦。。。經過上面的過程呢。。
咱們可以獲取一個進程它所創建的所有的鏈接的信息了。
。。
那麼接下來一步就是怎樣來計算它的網絡流量狀況了。
。。
嗯。這裏nethogs 採用的方法是利用libcap來抓包。而後對網絡包進行分析,從而來計算每一個鏈接它的網絡流量狀況。。。(嗯,好多代碼都是直接採用的nethogs的源碼)
嗯,這裏就不詳細的來列出實現的代碼了。
。
用c++以及libcap爲python寫了一個linux如下的擴展庫。。。代碼傳到了github上面。。
。地址例如如下:
https://github.com/2225377fjs/processNet