======================= 一 个 封 装 了 IOCP 的 DLL ====================================
设计想法:
1、IOCP的DLL实现内存自制,既内存DLL自我管理,用户申请内存,用户释放,DLL的内存,用户不得释放
2、用户至少需要提供三个LPTHREAD_START_ROUTINE类型的指针,用户处理接收数据、接受客户端连接、以及用户释放连接等事件
当然,也可以将传入NULL表示不处理对应事件。此外,用户也可以选择是否处理发送成功消息(并没处理发送失败事件,可
以考虑未来版本增加),在每次处理事件结束后,IOCP的DLL不保证数据仍然可用,如果用户对那些信息感兴趣,应该自己
保持一份信息!
设计细节:
1、IOCP初始化时,创建一个用于接收客户端连接的线程,此线程会一直阻塞在accept函数上,直到有新连接进来或者accept被打断,
如果有新连接到来,将在堆上创建一个PER_HANDLE_DATA类型的结构,并包含两段内存(一段用于此socket的接收数据缓冲,另一
段用户此socket的发送缓冲),此结构在中断连接后释放,用户不需要管理。
2、IOCP初始化时,亦同时创建N个(N 等于当前机器CPU个数)的工作线程,这几个线程负责IOCP DLL的大部分工作(并将调用创建初始
给出的事件处理函数,并将对应的PER_HANDLE_DATA的地址传给事件处理函数)。具体看代码和示例代码
3、IOCP初始化时,还将创建一个垃圾回收线程,用户处理垃圾回收,因为在工作线程得知连接中断后,并不是马上释放内存,
而是将数据放入垃圾站,由垃圾回收线程进行回收
4、用户delete iocp时,iocp会等待以上线程均安全退出,并中断和释放当前仍在线的连接,然后安全退出。
已知BUG:
1、垃圾回收线程,仍然无法保证不释放仍在使用的内存(尽管概率很小)
额外说明:
1、毕设用的IOCP,未能做大量测试,可能存在未知BUG,如果发现BUG,请按以下联系方式联系本人,不甚感激!!
2、特别注意,IOCP不保证所调用的事件处理函数是线程安全的,这部分应该有用户自行保证!
3、最新更新,请留意 svn://svnhost.cn/IOCP_DLL
联系方式:
Email:helloripple@qq.com
QQ:271547131
Ripple
2010年5月6日
于福州大学