發表文章

目前顯示的是 3月, 2017的文章

在linux下用C實作netstat (Implement netstat)

圖片
在Linux 下, netstat 指令常被用來查詢網路各種資訊,像是 在TCP、UDP、IP  ethernet 和 socket 中的各種資訊。 至於 netstat 則是去/proc中抓取各個所需要的資料。  /proc是系統模擬出來、假的(虛擬)檔案系統(pseudo-filesystem),它是外界讀取核心資訊的對外窗口 。 說是假的檔案系統是因為/proc中每個檔案在當user-process讀取/proc下的檔案時,才會即時(real-time)產生檔案中的「內容」。   以下 是Linux Programmer's Manual 中對於proc的描述 : The proc filesystem is a pseudo-filesystem which provides an interface to kernel data structures. from man proc 在/proc 這個目錄下,可以分為兩種類型的檔案:一種是只有數字編號的目錄,其代表每個執行中的Process 的ID (i.e. pid); 另一種非數字編號的則是與系統資訊相關的檔案。 在這個實作中我們需要使用到的是 /proc/net,該目錄下儲存著各種網路層的資訊。其中的/tpc與/udp分別儲存著tpc socket table與udp socket。 當我們對其中一個(udp) 貓一下( cat 指令)後,會出現如下的表格: 在這些欄位中,我們所需要的分別是 local_address 、 rem_address 與 inode 。 其中inode在這裡所代表 的意義很重要, 因為 使用該 addr :port的process 會 link到該inode 。講到這邊 大概就 已經講完所有原理了,最後只要找到 link到所有inode 的process就能完成了。 至於這個link要去哪裡找呢? 這就要 去 /proc 目錄下所有的數字目錄中的/ fd( f ile d escriptors)目錄 去慢慢找,即 /proc/[pid]/fd/ ,找到 所有symbolic link 到 inode 的 pid 。 例如我現找到一pid=878的process符合此條件(絕對剛好是87的),於是在/proc/878