#
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 }
最近做一個(gè)項(xiàng)目,需要記錄系統(tǒng)里每個(gè)進(jìn)程訪問的IP及Port,然后提交到服務(wù)端進(jìn)行分析,我的思路是用一個(gè)緩存文件記錄所有進(jìn)程訪問網(wǎng)絡(luò)的信息,然后在主程序中提取記錄再提交。 這里面涉及到多進(jìn)程訪問同一個(gè)緩存文件的同步問題,于是封裝了下面這個(gè)類,自我感覺良好,拿出來和大家分享 :)
* 使用類似于環(huán)形鏈表的機(jī)制來保證運(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)用該方法,不用考慮同步問題 21 prl->AddLog(&ti); // 寫入到緩沖文件中 22 } 23 delete prl; 24 return 0; 25 } 26 27 int main(int argc, char* argv[]) 28 { 29 // 開兩個(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é)果可以看到主線程讀取到的記錄是亂序的,但沒有丟失的記錄。。 下載示例代碼 /Files/sToa/TestCache.rar
本代碼服務(wù)端引用了http://www.codeproject.com/KB/IP/IOCP_how_to_cook.aspx中的代碼,并作了少量修改,在這里對(duì)原作者表示感謝。。
功能描述: * 封裝了心跳機(jī)制 * 封裝了一層應(yīng)用層協(xié)議,支持壓縮傳輸 * Client端封裝了掉線重連機(jī)制
示例代碼演示了文件傳輸并輸出傳輸速度 希望朋友們能不吝指教,幫助我進(jìn)步 :)
點(diǎn)擊下載源碼
服務(wù)端:
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... 閱讀全文
這個(gè)程序是2004年初學(xué)編程時(shí)的作品,當(dāng)時(shí)是憑著一種現(xiàn)在看來都有些欽佩自己的激情下作出的,感謝俄羅斯方塊帶我入門. 這個(gè)程序雖然簡(jiǎn)陋,代碼也混亂,Ai智能也不高,但也算完整,希望對(duì)俄羅斯方塊程序有興趣的朋友有所幫助 :)
 /Files/sToa/20040607tetris.rar /Files/sToa/sztetris20040926_SRC.rar
看了幾位大嚇的回復(fù),深深地感覺到了這篇附筆中可能存在錯(cuò)誤,于是把最初遇到此問題時(shí)的環(huán)境再模擬了一下,現(xiàn)在可以確認(rèn)這篇附筆中的確存在問題,現(xiàn)在就修正一下,并對(duì)各位表示歉意. 6月初的一個(gè)項(xiàng)目中需要寫一個(gè)高性能網(wǎng)絡(luò)服務(wù)端程序,在網(wǎng)上找到了一份很好的代碼(請(qǐng)參見),在使用過程中發(fā)現(xiàn)在多個(gè)cpp文件中引入這份代碼的h文件時(shí),會(huì)出現(xiàn)很多重復(fù)定義錯(cuò)誤,當(dāng)時(shí)很頭疼,沒能很好的解決問題. 現(xiàn)總結(jié)一條:在使用類模板技術(shù)時(shí),可在.h中實(shí)現(xiàn),也可在.h和.cpp中分開實(shí)現(xiàn),若用.h實(shí)現(xiàn),不要在文件中加入非類模板代碼,可避免重寫定義錯(cuò)誤.. 2009年7月25日23時(shí)58分58秒 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 原文如下:Posted on 2009-07-25 15:10 sToa //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1.聲明部分
2.實(shí)現(xiàn)部分
3.習(xí)慣錯(cuò)誤用法
 // main.cpp  #include "Tpl.h"   int main()    {  CTpl<char> ts;  ts.Test(3);  return 0;  }
build時(shí)出現(xiàn)link錯(cuò)誤 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) 這組錯(cuò)誤信息和project中不加入Tpl.cpp的錯(cuò)誤信息一樣,即沒有CTpl<char>的實(shí)現(xiàn)代碼 我們把Tpl.cpp包涵到main.cpp中,問題解決 4.正確用法
 // main.cpp  #include "tpl.cpp"  int main()    {  CTpl<char> ts;  ts.Test(3);  return 0;  }
5.總結(jié) 1.在使用以.h,.cpp分離實(shí)現(xiàn)模板類時(shí),不能像使用普通類一樣只簡(jiǎn)單的包涵.h頭文件,應(yīng)該在使用模板類的cpp文件中引入模板類相應(yīng)的cpp文件 2.將模板類的聲明與實(shí)現(xiàn)都放在.h中(在多個(gè)cpp中使用不同模板參數(shù)時(shí)可能會(huì)引起重復(fù)定義的編譯錯(cuò)誤)
|