学习、成长之路

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  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 阅读(641) | 评论 (0)编辑 收藏

最近做一个项目,需要记录系统里每个进程访问的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
posted @ 2009-08-16 13:41 sToa 阅读(1742) | 评论 (1)编辑 收藏

 

本代码服务端引用了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, 
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 阅读(3858) | 评论 (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 阅读(1713) | 评论 (0)编辑 收藏

这个程序是2004年初学编程时的作品,当时是凭着一种现在看来都有些钦佩自己的激情下作出的,感谢俄罗斯方块带我入门.
这个程序虽然简陋,代码也混乱,Ai智能也不高,但也算完整,希望对俄罗斯方块程序有兴趣的朋友有所帮助 :)

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

posted @ 2009-07-25 16:05 sToa 阅读(3179) | 评论 (6)编辑 收藏

看了几位大吓的回复,深深地感觉到了这篇附笔中可能存在错误,于是把最初遇到此问题时的环境再模拟了一下,现在可以确认这篇附笔中的确存在问题,现在就修正一下,并对各位表示歉意.
6月初的一个项目中需要写一个高性能网络服务端程序,在网上找到了一份很好的代码(
请参见),在使用过程中发现在多个cpp文件中引入这份代码的h文件时,会出现很多重复定义错误,当时很头疼,没能很好的解决问题.
现总结一条:在使用类模板技术时,可在.h中实现,也可在.h和.cpp中分开实现,若用.h实现,不要在文件中加入非类模板代码,可避免重写定义错误..
      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.实现部分
// 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时出现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中使用不同模板参数时可能会引起重复定义的编译错误)




posted @ 2009-07-25 15:10 sToa 阅读(9098) | 评论 (7)编辑 收藏

仅列出标题
共2页: 1 2