最近新到乙個公司上班,所做的專案與網路通訊有關,網路通訊,必然涉及到收發網路包,為了檢查我封裝的包的資料是否正確,為了便於與通訊方進行比對,我需要獲得最終收發包的二進位制資料。
這個通常有以下實現方式:
1、網路抓包,典型的做法是,根據通訊網路裝置的組網,在交換機建立port-mirroring,把執行抓包工具(wireshark)的電腦練到這個映象 口,把通過某些埠的網路包全抓下來進行分析;
2、平台提供了乙個抓包的命令(可直接執行,不需要配置交換機什麼的),但是它會把包的有效資料截斷,只保留前面幾個位元組,因此只能看到有沒有包,不能看到包的資料對不對;
3、我在**的收發包處,以日誌的形式列印出包的二進位制資料。
我選的是方案3,因為,對方案1,一開始我還不知道怎麼在交換機配port-mirroring(現在知道了,可以專門寫篇文章介紹一下);對方案2,我不知道這是bug還是有意為之。我搜尋了**,沒看到有類似的,看來只能自己實現了。
其實這個的本質就是以16進製制的形式列印一段記憶體,就跟我們在除錯時的memory視窗,或者二進位制閱讀器看到的一樣:
很自然的解決方案就是c++的ostringstream,唯一要處理的就是這個模組原來全是c**,就需要在c中呼叫c++的東西,需要新增乙個.cpp原始檔,需要簡單修改makefile(c/c++混合程式設計的makefile)。
這裡我簡單介紹c呼叫c++的實現,和如何列印二級制記憶體。
// c++檔案,util.cpp
#include
#include
#include
#include
using
namespace
std;
extern
"c"void ***_readmemory(unsigned
char * pucbuf, unsigned
long ullen);
void ***_readmemory(unsigned
char * pucbuf, unsigned
long ullen)
std::cout
/ c檔案,***_dosth.c
extern
void ***_readmemory(unsigned
char * pucbuf, unsigned
long ullen);
void print_memory()
這裡util.cpp檔案由g++編譯,extern 「c」告訴g++編譯器按照c的規則生成符號名稱,按照不同呼叫規則,符號名稱會有不同,這裡是_***_readmemory(windows下通過vs自帶的工具dumpbin可以檢視,linux通過nm可以檢視).
***_dosth.c檔案由gcc編譯,自然是按照c的規則生成和解析符號名稱,所以只需宣告extern,鏈結的時候,就通過_***_readmemory這個符號名稱完成鏈結。
另外一種實現方式,還是用c語言,思路就是把每乙個byte的資料以十六進製制字串的形式寫入到輸出記憶體中(對應2個或多個字元),這樣實現也挺簡單:
void ***_readmemory(unsigned
char * pucinbuf, unsigned
long ulinlen, char * poutbuf, unsigned
long uloutlen)
*(poutbuf+uloutlen-1) = '\0';
}
android 記憶體檢視
直接對android檔案進行解析查詢,proc cpuinfo系統cpu的型別等多種資訊。proc meminfo 系統記憶體使用資訊 如 proc meminfo memtotal 16344972 kb memfree 13634064 kb buffers 3656 kb cached 119...
Linux 記憶體檢視
可以直接使用top命令後,檢視 mem的內容。可以選擇按程序檢視或者按使用者檢視,如想檢視oracle使用者的程序記憶體使用情況的話可以使用如下的命令 top u oracle 或者直接使用 ps 命令 內容解釋 pid 程序的id user 程序所有者 pr 程序的優先級別,越小越優先被執行 ni...
linux記憶體檢視
可以直接使用top命令後,檢視 mem的內容。可以選擇按程序檢視或者按使用者檢視,如想檢視oracle使用者的程序記憶體使用情況的話可以使用如下的命令 1 top top命令是linux下常用的效能分析工具,能夠實時顯示系統中各個程序的資源占用狀況,類似於windows的任務管理器 可以直接使用to...