• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            學習、成長之路

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              16 Posts :: 0 Stories :: 27 Comments :: 0 Trackbacks

            常用鏈接

            留言簿

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            #

             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 }
            posted @ 2009-08-17 11:00 sToa 閱讀(662) | 評論 (0)編輯 收藏

            最近做一個項目,需要記錄系統(tǒng)里每個進程訪問的IP及Port,然后提交到服務端進行分析,我的思路是用一個緩存文件記錄所有進程訪問網絡的信息,然后在主程序中提取記錄再提交。
            這里面涉及到多進程訪問同一個緩存文件的同步問題,于是封裝了下面這個類,自我感覺良好,拿出來和大家分享 :)

            * 使用類似于環(huán)形鏈表的機制來保證運行效率


            測試程序如下:
             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
            posted @ 2009-08-16 13:41 sToa 閱讀(1763) | 評論 (1)編輯 收藏

             

            本代碼服務端引用了http://www.codeproject.com/KB/IP/IOCP_how_to_cook.aspx中的代碼,并作了少量修改,在這里對原作者表示感謝。。

            功能描述:
            * 封裝了心跳機制
            * 封裝了一層應用層協(xié)議,支持壓縮傳輸
            * 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, 
            00, 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(
            990850008150000);
                
            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;
            }

             


             


            posted @ 2009-08-13 11:21 sToa 閱讀(3929) | 評論 (2)編輯 收藏

                 摘要: 原鏈接: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...  閱讀全文
            posted @ 2009-07-31 12:06 sToa 閱讀(1730) | 評論 (0)編輯 收藏

            這個程序是2004年初學編程時的作品,當時是憑著一種現(xiàn)在看來都有些欽佩自己的激情下作出的,感謝俄羅斯方塊帶我入門.
            這個程序雖然簡陋,代碼也混亂,Ai智能也不高,但也算完整,希望對俄羅斯方塊程序有興趣的朋友有所幫助 :)

            /Files/sToa/20040607tetris.rar
            /Files/sToa/sztetris20040926_SRC.rar

            posted @ 2009-07-25 16:05 sToa 閱讀(3207) | 評論 (6)編輯 收藏

            看了幾位大嚇的回復,深深地感覺到了這篇附筆中可能存在錯誤,于是把最初遇到此問題時的環(huán)境再模擬了一下,現(xiàn)在可以確認這篇附筆中的確存在問題,現(xiàn)在就修正一下,并對各位表示歉意.
            6月初的一個項目中需要寫一個高性能網絡服務端程序,在網上找到了一份很好的代碼(
            請參見),在使用過程中發(fā)現(xiàn)在多個cpp文件中引入這份代碼的h文件時,會出現(xiàn)很多重復定義錯誤,當時很頭疼,沒能很好的解決問題.
            現(xiàn)總結一條:在使用類模板技術時,可在.h中實現(xiàn),也可在.h和.cpp中分開實現(xiàn),若用.h實現(xiàn),不要在文件中加入非類模板代碼,可避免重寫定義錯誤..
                  2009年7月25日23時58分58秒
            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            // 原文如下:Posted on 2009-07-25 15:10 sToa
            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

            1.聲明部分
            // Tpl.h
            #pragma once

            template<class T>
            class CTpl  
            {
            public:
                CTpl();
                virtual ~CTpl();

                void Test(T t);

            };

            2.實現(xiàn)部分
            // Tpl.cpp
            #include "Tpl.h"

            template<class T>
            CTpl<T>::CTpl()
            {

            }

            template<class T>
            CTpl<T>::~CTpl()
            {

            }

            template<class T>
            void CTpl<T>::Test(T t)
            {

            }
            3.習慣錯誤用法
            // main.cpp
            #include "Tpl.h"

            int main()
            {
                CTpl<char> ts;
                ts.Test(3);
                return 0;
            }

            build時出現(xiàn)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>的實現(xiàn)代碼
            我們把Tpl.cpp包涵到main.cpp中,問題解決
            4.正確用法

            // main.cpp
            #include "tpl.cpp"
            int main()
            {
                CTpl<char> ts;
                ts.Test(3);
                return 0;
            }

            5.總結
            1.在使用以.h,.cpp分離實現(xiàn)模板類時,不能像使用普通類一樣只簡單的包涵.h頭文件,應該在使用模板類的cpp文件中引入模板類相應的cpp文件
            2.將模板類的聲明與實現(xiàn)都放在.h中(在多個cpp中使用不同模板參數時可能會引起重復定義的編譯錯誤)




            posted @ 2009-07-25 15:10 sToa 閱讀(9183) | 評論 (7)編輯 收藏

            僅列出標題
            共2頁: 1 2 
            香蕉久久夜色精品国产小说| 久久国产精品-久久精品| 日韩亚洲国产综合久久久| 青春久久| 精品无码久久久久久尤物| 欧美日韩精品久久久免费观看| 国产精品久久婷婷六月丁香| 国内精品久久久久影院优| 日产久久强奸免费的看| 色综合久久久久久久久五月| 国产成人精品综合久久久| 亚洲精品白浆高清久久久久久| 久久亚洲国产欧洲精品一| 2021最新久久久视精品爱| 中文字幕成人精品久久不卡| 久久久久久午夜精品| 久久精品成人免费观看97| 99久久99久久精品免费看蜜桃| 日韩精品久久久久久久电影| 久久国产乱子伦精品免费强| 久久国产色av免费看| 亚洲国产成人久久综合区| 97久久精品人人做人人爽| 国产精品免费福利久久| 亚洲∧v久久久无码精品| 欧美与黑人午夜性猛交久久久| 99国产欧美精品久久久蜜芽| 久久午夜无码鲁丝片| 久久人妻AV中文字幕| 波多野结衣久久| 久久久精品国产| 久久一区二区三区免费| 99久久久久| 久久高清一级毛片| 久久久免费观成人影院| 久久综合日本熟妇| 国产精品成人久久久| 久久91精品国产91| 精品熟女少妇AV免费久久| 久久妇女高潮几次MBA| 久久SE精品一区二区|