最近做一个项目,需要记录系统里每个进程访问的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