#
1 BOOL CleanUrlCache(LPSTR lpUrl) 2 { 3 LPINTERNET_CACHE_ENTRY_INFO lpICEI = NULL; 4 DWORD dwSize = 0; 5 HANDLE hFind = FindFirstUrlCacheEntry(NULL, NULL, &dwSize); 6 if (hFind == NULL && GetLastError() != ERROR_INSUFFICIENT_BUFFER) 7 return FALSE; 8 9 lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize]; 10 hFind = FindFirstUrlCacheEntry(NULL, lpICEI, &dwSize); 11 if (hFind == NULL) 12 { 13 delete lpICEI; 14 return FALSE; 15 } 16 17 do 18 { 19 if (StrStrI(lpICEI->lpszSourceUrlName, lpUrl)) 20 { 21 int bRet = DeleteUrlCacheEntry(lpICEI->lpszSourceUrlName); 22 } 23 delete lpICEI; 24 lpICEI = NULL; 25 dwSize = 0; 26 27 if (!FindNextUrlCacheEntry(hFind, NULL, &dwSize) && GetLastError() != ERROR_INSUFFICIENT_BUFFER) 28 break; 29 lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize]; 30 } while (FindNextUrlCacheEntry(hFind, lpICEI, &dwSize)); 31 32 if (lpICEI != NULL) 33 delete lpICEI; 34 return TRUE; 35 }
最近做一个项目,需要记录系统里每个进程访问的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
本代码服务端引用了http://www.codeproject.com/KB/IP/IOCP_how_to_cook.aspx中的代码,并作了少量修改,在这里对原作者表示感谢。。
功能描述: * 封装了心跳机制 * 封装了一层应用层协议,支持压缩传输 * Client端封装了掉线重连机制
示例代码演示了文件传输并输出传输速度 希望朋友们能不吝指教,帮助我进步 :)
点击下载源码
服务端:
class CMyTcpServer : public CFTcpServer { public: CMyTcpServer(); virtual ~CMyTcpServer(); virtual BOOL OnReadF(SCSocket *pSocket, PBYTE pData, DWORD dwLen) { static DWORD btCount = 0; static DWORD dwTime = GetTickCount(); static DWORD lastTime = dwTime; btCount += dwLen; HANDLE hFile = CreateFile("c:\\abc.dat", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); SetFilePointer(hFile, 0, 0, FILE_END); DWORD dwBytesWrite = 0; WriteFile(hFile, pData, dwLen, &dwBytesWrite, NULL); CloseHandle(hFile); DWORD dwTTT = GetTickCount(); if (dwTTT - lastTime > 1000) { lastTime = dwTTT; printf("%dkb/s %u\n", (int)(((double)btCount) * 1000 / (dwTTT - dwTime) / 1024), btCount); } return TRUE; } virtual int OnConnected(SCSocket *pSocket){return TRUE}; };
int main(int argc, char* argv[]) { CMyTcpServer::InitSocketLib(); CMyTcpServer ts; ts.Start(9908, 5000, 8, 150000); while( !_kbhit() ) ::Sleep(100); ts.Stop(); return 0; }
客户端:
class CMyTcpClient : public CFTcpClient { public: CMyTcpClient(); virtual ~CMyTcpClient(); virtual VOID OnConnected() { char buff[BUFF_SIZE_C - 100]; HANDLE hFile; hFile = CreateFile("c:\\abc.dat", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); DWORD nNumberOfBytesRead = 0; int pos = 0; while (ReadFile(hFile, buff, BUFF_SIZE_C - 100, &nNumberOfBytesRead, NULL)) { if (BUFF_SIZE_C - 100 == nNumberOfBytesRead) Send(buff, nNumberOfBytesRead); else break; } CloseHandle(hFile); Send(buff, nNumberOfBytesRead, TRUE); }; virtual int OnReadF(LPSTR pData, int nSize) { return TRUE; } };
int main(int argc, char* argv[]) { CMyTcpClient::InitSocketLib(); CMyTcpClient *pcl = new CMyTcpClient; pcl->Start("192.168.1.138", 9908); while( !_kbhit() ) ::Sleep(100); return 0; }
摘要: 原链接:http://bbs.pediy.com/showthread.php?t=63212&highlight=Hook+Api+lib稍微改了一下
// OpCode.h#if !defined(AFX_OPCODE_H__B8F7B840_D73F_461E_B08A_0202DD397B15__INCLUDED_)#define AFX_OPCOD... 阅读全文
这个程序是2004年初学编程时的作品,当时是凭着一种现在看来都有些钦佩自己的激情下作出的,感谢俄罗斯方块带我入门. 这个程序虽然简陋,代码也混乱,Ai智能也不高,但也算完整,希望对俄罗斯方块程序有兴趣的朋友有所帮助 :)
/Files/sToa/20040607tetris.rar /Files/sToa/sztetris20040926_SRC.rar
看了几位大吓的回复,深深地感觉到了这篇附笔中可能存在错误,于是把最初遇到此问题时的环境再模拟了一下,现在可以确认这篇附笔中的确存在问题,现在就修正一下,并对各位表示歉意. 6月初的一个项目中需要写一个高性能网络服务端程序,在网上找到了一份很好的代码(请参见),在使用过程中发现在多个cpp文件中引入这份代码的h文件时,会出现很多重复定义错误,当时很头疼,没能很好的解决问题. 现总结一条:在使用类模板技术时,可在.h中实现,也可在.h和.cpp中分开实现,若用.h实现,不要在文件中加入非类模板代码,可避免重写定义错误.. 2009年7月25日23时58分58秒 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 原文如下:Posted on 2009-07-25 15:10 sToa //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1.声明部分
2.实现部分
3.习惯错误用法
// main.cpp #include "Tpl.h" int main() { CTpl<char> ts; ts.Test(3); return 0; }
build时出现link错误 main.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall CTpl<char>::~CTpl<char>(void)" (??1?$CTpl@D@@UAE@XZ) main.obj : error LNK2001: unresolved external symbol "public: void __thiscall CTpl<char>::Test(char)" (?Test@?$CTpl@D@@QAEXD@Z) main.obj : error LNK2001: unresolved external symbol "public: __thiscall CTpl<char>::CTpl<char>(void)" (??0?$CTpl@D@@QAE@XZ) 这组错误信息和project中不加入Tpl.cpp的错误信息一样,即没有CTpl<char>的实现代码 我们把Tpl.cpp包涵到main.cpp中,问题解决 4.正确用法
// main.cpp #include "tpl.cpp" int main() { CTpl<char> ts; ts.Test(3); return 0; }
5.总结 1.在使用以.h,.cpp分离实现模板类时,不能像使用普通类一样只简单的包涵.h头文件,应该在使用模板类的cpp文件中引入模板类相应的cpp文件 2.将模板类的声明与实现都放在.h中(在多个cpp中使用不同模板参数时可能会引起重复定义的编译错误)
|