首页
社区
课程
招聘
[分享]共享完成端口代码(支持connect)
发表于: 2008-10-6 20:05 14908

[分享]共享完成端口代码(支持connect)

2008-10-6 20:05
14908
完成端口IOCP,支持connect,没有多余的listen线程,不会有只能同时accept 64个socket的限制

最近写的一个程序要用完成端口,于是我在网上找了些完成端口的代码,
下载下来的代码,几乎都不能用,很多是VC6下用的,用vs2005编译,老是不能通过
于是,我就自己写了一个vs2005下能编译的完成端口类,支持connect这只有一个类,LPCLIENT_CONTEXT指向的是一个含有SOCKET相关信息的结构指针
可以能过LPCLIENT_CONTEXT得到本次连接的SOCKET相关信息

该类没有引入池的概念,因为我的程序用不池,所以没有必要花时间在上面,不过,实现池不难
重要的是该类支持connect函数,这个在网上不好找,我没有找到,是自己写的一个,
用这个类来做一个CC攻击器,效果应该不错,connect设计之初,就是为了来干这些坏事的,哈哈~~~

我相信有很多人在找完成端口的代码,找下来之后,用.net编译不了,有能编译的,但无效果,发一个出来,希望对大家有帮助
共同学习,进步

代码中有BUG,欢迎大家测试指出

10.9
今天更新一下,加入了内存缓冲池,修正了一个BUG,就是一接受连接或连接成功就关闭socket的时候,程序会无限循环,而至CPU使用达100%,差不多了,这个IOCP可以投入正式使用了
但我有一个问题如下:请大家指教一下
void CIOCP::DeleteClientContext(LPCLIENT_CONTEXT pclient)
{

        closesocket( pclient->IoSocket );
        //CloseHandle( pclient->hComPort );
        /*
        10.9
        这里不能把与socket 绑定的完成端口CloseHandle,如果使用了,那么,
                在WorkThreadFun中的GetQueuedCompletionStatus将得到windows 6号错误(错误的句柄),我参考了很多IOCP代码,都没有CloseHandle,不知道,这样会不会造成"句柄泄漏"
通过实验得出,这里的hComPort不能CloseHandle,只有等程序退出的时候,才能
        */
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 1
支持
分享
最新回复 (24)
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
2
收藏之, 谢谢LZ
2008-10-7 08:32
0
雪    币: 251
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢,收下了....
2008-10-7 14:04
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
高手们,请来指教一下,,小弟有些问题,这问题不容忽视!!~~~~

10.9
今天更新一下,加入了内存缓冲池,修正了一个BUG,就是一接受连接或连接成功就关闭socket的时候,程序会无限循环,而至CPU使用达100%,差不多了,这个IOCP可以投入正式使用了
但我有一个问题如下:请大家指教一下
void CIOCP::DeleteClientContext(LPCLIENT_CONTEXT pclient)
{

        closesocket( pclient->IoSocket );
        //CloseHandle( pclient->hComPort );
        /*
        10.9
        这里不能把与socket 绑定的完成端口CloseHandle,如果使用了,那么,
                在WorkThreadFun中的GetQueuedCompletionStatus将得到windows 6号错误(错误的句柄),我参考了很多IOCP代码,都没有CloseHandle,不知道,这样会不会造成"句柄泄漏"
通过实验得出,这里的hComPort不能CloseHandle,只有等程序退出的时候,才能
        */
}
2008-10-9 11:34
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个也关注,完成端口复杂啊,头都绕晕了
2008-10-9 16:27
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
的确复杂,只要自己写了一次,就明白了,

我从去年年底就开始研他,可一直没有写,这次终于有决心写完了
2008-10-9 23:02
0
雪    币: 238
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
感觉你在关了SOCKET就关 CP HANDLE,我认为肯定不行,CP HANDLE 被你关了, 在工作者线程中再调用该CP HANDEL当然就报错了
个人见解 看完你的代码后再说,呵呵(没看就发表意见呀?!!!)
2009-7-7 21:20
0
雪    币: 220
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
强烈关注。。。。我mark下了
2009-7-7 21:46
0
雪    币: 238
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
呵呵,看到了这句 hCom = CreateIoCompletionPort( (HANDLE)hsocket,m_comPort,0,0);
这理解这句 hCom 是 CreateIoCompletionPort 的返回句柄,应该和 你在参数中 m_comPort 是一样的吧,不信你调试一下看看,而你又
pClientContext->hComPort = hCom;
这个上下文中的hComPort 就是你在最开始建立的CP,当然不能关了,关了工作者线程就找不到CP了,呵呵
2009-7-7 21:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
下来看看,谢谢分享
2009-7-8 17:46
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
干什么用的都不知道,自卑路过
2009-7-8 21:15
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
完成端口复杂啊,头都绕晕了
2009-7-8 22:16
0
雪    币: 183
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
楼主很大方,谢谢楼主
2010-3-24 17:32
0
雪    币: 236
活跃值: (26)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
14
作为专门从事大规模网络服务器编程人员,对楼主的做法表示赞许,里面确实很好的处理了accept和connect,但是,整体还是比较的简单啊,继续努力!
2010-3-25 09:25
0
雪    币: 92
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
研究过完成端口
先留名再看
2010-3-25 10:47
0
雪    币: 2559
活跃值: (176)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
16
给大家个例子吧,其实理解了就不难了!!!

#include <windows.h>

#include "CIOCPTHREAD.h"

void CIOCPTHREAD::Execute()
{
        DWORD                  dwBytesIO;
    DWORD        dwCompletionKey;
    LPOVERLAPPED lpOverlapped;

        while( !IsTerminated() )
        {
                if( 0==::GetQueuedCompletionStatus( m_hIOCP, &dwBytesIO, &dwCompletionKey, (LPOVERLAPPED *)&lpOverlapped, INFINITE) )
                {
                        if( NULL!=lpOverlapped )
                        {
                                DWORD dwErrCODE = ::GetLastError();

                                ReturnFAILED( lpOverlapped, dwCompletionKey, dwErrCODE );
                                continue;
                        }
                        break;
                }
                if( 0==dwBytesIO)
                {
                        ReturnFAILED( lpOverlapped, dwCompletionKey,dwErrCODE);
                        continue;
                }
        if ((int)dwBytesIO == -1 )
                {
            break;
        }               
                ReturnOK( lpOverlapped, dwCompletionKey, dwBytesIO );
        }
}

bool CIOCPTHREAD::Init(HANDLE hIOCP)
{
    m_hIOCP = hIOCP;

    return true;
}

void CIOCPTHREAD::Free(void)
{
    Terminate();
        do
        {
        if ( 0 == ::PostQueuedCompletionStatus( m_hIOCP, -1, 0, NULL) )
                {
                        break;
        }
        }while( !IsFinished() ) ;
}
2010-3-28 15:59
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
留名先研究再看
2010-3-30 17:46
0
雪    币: 255
活跃值: (49)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
18
感谢分享 学习
2010-3-30 19:22
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
thx 下下来看看
2010-6-23 15:25
0
雪    币: 216
活跃值: (753)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
留名先研究再看,楼主好人!
2010-6-24 12:34
0
雪    币: 320
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
研究过iocp,看一下楼主的成果
2010-6-24 15:06
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
非常有帮助的代码,感谢搂主!
2010-10-18 16:02
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
强烈关注~~~~~
2010-10-19 23:00
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
已加收藏 持续关注中..
2010-10-23 02:20
0
雪    币: 156
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
完成端口的核心是:Contex的“引用计数”处理,这个处理不好,大并发的情况下会报莫名奇妙的错误!

另外,多线程情况下,多内存池提高效率注意64位对齐,因为CPU的cache line是64bit对齐的,否则多内存池也不会起任何提高性能的作用
2010-10-29 18:01
0
游客
登录 | 注册 方可回帖
返回
//