最近做一個項目,需要記錄系統里每個進程訪問的IP及Port,然后提交到服務端進行分析,我的思路是用一個緩存文件記錄所有進程訪問網絡的信息,然后在主程序中提取記錄再提交。
這里面涉及到多進程訪問同一個緩存文件的同步問題,于是封裝了下面這個類,自我感覺良好,拿出來和大家分享 :)
* 使用類似于環形鏈表的機制來保證運行效率
測試程序如下:
1 #include "RecodeLog.cpp"
2 #include <stdio.h>
3 #pragma pack(1)
4 // 測試用結構,可自定義,結構中不應該包涵指針類型
5 typedef struct _tagTestInfo
6 {
7 DWORD nTest;
8 char szTest[32];
9 }TESTINFO, *PTESTINFO;
10 #pragma pack()
11
12 ULONG WINAPI TestThread(PVOID pParam)
13 {
14 TESTINFO ti;
15 CRecodeLog<TESTINFO> *prl = new CRecodeLog<TESTINFO>("TestRL", "c:\\trl.dat", 1000);
16 for (int i = 0; i < 100; i++)
17 {
18 ti.nTest = i;
19 itoa(i, ti.szTest, 10);
20 // 可在任意進程或線程中調用該方法,不用考慮同步問題
21 prl->AddLog(&ti); // 寫入到緩沖文件中
22 }
23 delete prl;
24 return 0;
25 }
26
27 int main(int argc, char* argv[])
28 {
29 // 開兩個線程,每個線程增加100條記錄
30 HANDLE hThread, hThread2;
31 hThread = CreateThread(NULL, NULL, TestThread, NULL, NULL, NULL);
32 hThread2 = CreateThread(NULL, NULL, TestThread, NULL, NULL, NULL);
33 WaitForSingleObject(hThread, INFINITE);
34 WaitForSingleObject(hThread2, INFINITE);
35 CloseHandle(hThread);
36 CloseHandle(hThread2);
37
38
39 CRecodeLog<TESTINFO> *prl = new CRecodeLog<TESTINFO>("TestRL", "c:\\trl.dat", 1000);
40 TESTINFO getTi;
41 int ncount = 0;
42 while (prl->GetTop(&getTi)) // 取最頂部的緩存記錄
43 {
44 printf("%d--%s\n", getTi.nTest, getTi.szTest);
45 prl->DelTop(); // 刪除最頂端的緩存記錄
46 ncount++;
47 }
48 printf("%d\n", ncount);
49 delete prl;
50
51 return 0;
52 }
從運行結果可以看到主線程讀取到的記錄是亂序的,但沒有丟失的記錄。。
下載示例代碼
/Files/sToa/TestCache.rar