最近做一個(gè)項(xiàng)目,需要記錄系統(tǒng)里每個(gè)進(jìn)程訪問(wèn)的IP及Port,然后提交到服務(wù)端進(jìn)行分析,我的思路是用一個(gè)緩存文件記錄所有進(jìn)程訪問(wèn)網(wǎng)絡(luò)的信息,然后在主程序中提取記錄再提交。
這里面涉及到多進(jìn)程訪問(wèn)同一個(gè)緩存文件的同步問(wèn)題,于是封裝了下面這個(gè)類,自我感覺(jué)良好,拿出來(lái)和大家分享 :)
* 使用類似于環(huán)形鏈表的機(jī)制來(lái)保證運(yùn)行效率
測(cè)試程序如下:
1 #include "RecodeLog.cpp"
2 #include <stdio.h>
3 #pragma pack(1)
4 // 測(cè)試用結(jié)構(gòu),可自定義,結(jié)構(gòu)中不應(yīng)該包涵指針類型
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 // 可在任意進(jìn)程或線程中調(diào)用該方法,不用考慮同步問(wèn)題
21 prl->AddLog(&ti); // 寫入到緩沖文件中
22 }
23 delete prl;
24 return 0;
25 }
26
27 int main(int argc, char* argv[])
28 {
29 // 開(kāi)兩個(gè)線程,每個(gè)線程增加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 }
從運(yùn)行結(jié)果可以看到主線程讀取到的記錄是亂序的,但沒(méi)有丟失的記錄。。
下載示例代碼
/Files/sToa/TestCache.rar