当前位置: 代码迷 >> VC/MFC >> 最新版IOCP_API来袭,您准备好了吗
  详细解决方案

最新版IOCP_API来袭,您准备好了吗

热度:121   发布时间:2016-05-02 03:49:04.0
最新版IOCP_API来袭,你准备好了吗?
经历了两三年的沉寂之后,最新版IOCP_API网络编程库终于要来了。它沿袭了1.X版本的简洁设计和简单接口,并且提供更高的效率和更多的扩展功能。
最为关键的是——开源,我会毫无保留的奉送全部源码,coder们可以任意修改发布,而不需要支付一毛钱的版权。
你还在等什么,赶快来下载试用吧。


最新版IOCP_API为2.4版,相比较前面的版本(1.X版本),新版带来了如下好处:
1. 最新的API,数量只有十几个,涵盖了所有应用;也就是说,你仅仅通过这几个API,即可完成整个网络编程框架的搭建。简洁,方便是它与众不同之处。
2. 更高的效率;2.4版IOCP_API库经过优良的设计,使用一个IOCP核心(工作者线程组+内存池+业务线程池)即可完成所有的网络传输应用。
   你可以再这个核心上,跑任意数量的TCP服务器,跑任意数量数量的TCP客户端,还可以跑任意数量的UDP服务,甚至你还可以将他们混合来使用。
   这些都是在一个核心上完成的。不要羡慕,你已经拥有它了。
3. 更多的扩展功能; 除了传统的TCP和UDP外,2.4版IOCP_API库更是提供了Channel服务,让你无需担心大数据的拆包和组包业务,它完美的帮您处理了。
   你认为只有这些?不!还有更多的扩展功能——P2P、UDT和RPC,你是不是已经迫不及待了?
4. 一定的可扩展性;相比1.X版,2.4版提供可一个可编程的内存池接口,您如果觉得我提供的缺省内存池不够完美,您大可以自己实现一个,是不是很棒?!
5. 更简单的数据处理接口;所有的数据都是通过一个接口通知您来处理,不管是传统的TCP和UDP数据包,还是扩展的Channel数据包,您只要关心您注册
   的数据处理接口即可,其他的都交给2.4吧。去喝杯咖啡如何?
6. 更人性化和实用化的设计;您一定有过这样的经历,在一个异步网络架构的应用中,您因为一些特殊原因,需要一个同步接口,那是一件多么烦人的事情啊!
   现在好了,有了2.4,这一切都解决了,它提供了RPC接口,可以满足您的这个要求。同时由于它是用的异步模拟的同步的方式,所以也无需担心它的效率问题。
7. 更多的实用工具;除了提供便捷的网络编程接口外,2.4还提供很多实用工具,比如一个DBPool(基于ADO组件)——让你随心所欲的使用数据库;
   一个zlib压缩组件,一个FIFO队列等等,都是您编写网络程序必不可少的。


是不是很期待了?下面,我们来解开庐山真面路,走进IOCP_API。
在IOCP_API.h中定义的所有的编程库所提供接口API,下面是接口API列表:

[cpp] view plaincopy
IOCP_API HANDLE       IOCPStartup(INT iWorkThread, INT iThreadPool);  
IOCP_API RetCode      IOCPCleanup(HANDLE hIocp);  
  
IOCP_API ICache*      IOCPCreateCache(INT iMinNum, INT iMaxNum);  
IOCP_API RetCode      IOCPDestroyCache(ICache *pCache);  
  
IOCP_API TCPListener* IOCPCreateListener(HANDLE hIocp, INT iBindPort);  
IOCP_API TCPSocket*   IOCPCreateClient(HANDLE hIocp, INT iBindPort);  
IOCP_API UDPSocket*   IOCPCreateSocket(HANDLE hIocp, INT iBindPort);  
IOCP_API RetCode      IOCPDestorySocket(Socket* pSocket, SocketType sockType);  
  
IOCP_API ADOPool*     IOCPCreatePool(INT nMinPoolSize, INT nMaxPoolSize, const CHAR *pszConnStr);  
IOCP_API RetCode      IOCPDestoryPool(ADOPool *pAdoPool);  
  
IOCP_API RetCode      IOCPUnhandledException(IExceptionHandle *exception);  
  
IOCP_API ILogger*     IOCPCreateLogger(const CHAR *pszLogPath);  
IOCP_API RetCode      IOCPDestoryLogger(ILogger *pLogger);  
  
IOCP_API IBuffer*     IOCPCreateQueue(INT nCapacity);  
IOCP_API RetCode      IOCPDestoryQueue(IBuffer *pBuffer);  
看到这些接口,是不是觉得如此高效的网络编程接口竟然如此简单?答案却是如此,就是如此简单。您不需要了解IOCP的原理,甚至都不需要了解
网络通讯的原理,通过这些接口,您只要关心您的业务逻辑即可,其他的,都交给2.4吧。


与这些API相对应,在ISocket.h文件中,定义了相关的接口类,把相关功能都进行了封装,完全面向对象的编程方式,更适合传统的C++ coder们。
------解决思路----------------------
简单说一下感觉,难免管中窥豹;
1、楼主似乎对“接口”比较偏爱,感觉不必要的地方也都变成了接口,比如buffer的定义
2、网络库很重要的的考虑就是如何管理socket会话,在c++智能指针已经成为标准的今天,依然用原始指针来管理,对用户来说需要格外小心。一旦一个socket在别的线程销毁,而其他引用此socket的线程没有通知到已经销毁时,就会出问题
3、个人喜好吧,我觉得可以把类型命名、函数命名更中性一些,现在太过windows化了(虽然iocp是windows特有的)
4、代码有些随意,比如下面的sleep。毕竟sleep不是同步原语,如果需要等待,最好用WaitForSingleObject()之类的等待函数。

   RetCode CloseSocket(VOID)  
     {  
         if (m_hSocket != INVALID_SOCKET)  
         {  
             CancelIo((HANDLE)m_hSocket);  
             Sleep(500);  
             closesocket(m_hSocket);  
             Sleep(500);  
             m_socketType = ST_NONE;  
             m_hSocket = INVALID_SOCKET;  
         }  
         return RET_ESUC;  
     }  

------解决思路----------------------
功能上没有啥新意啊。不如哥的。
------解决思路----------------------
记得上版貌似没有开源
------解决思路----------------------
引用:
简单说一下感觉,难免管中窥豹;
1、楼主似乎对“接口”比较偏爱,感觉不必要的地方也都变成了接口,比如buffer的定义
2、网络库很重要的的考虑就是如何管理socket会话,在c++智能指针已经成为标准的今天,依然用原始指针来管理,对用户来说需要格外小心。一旦一个socket在别的线程销毁,而其他引用此socket的线程没有通知到已经销毁时,就会出问题
3、个人喜好吧,我觉得可以把类型命名、函数命名更中性一些,现在太过windows化了(虽然iocp是windows特有的)
4、代码有些随意,比如下面的sleep。毕竟sleep不是同步原语,如果需要等待,最好用WaitForSingleObject()之类的等待函数。

   RetCode CloseSocket(VOID)  
     {  
         if (m_hSocket != INVALID_SOCKET)  
         {  
             CancelIo((HANDLE)m_hSocket);  
             Sleep(500);  
             closesocket(m_hSocket);  
             Sleep(500);  
             m_socketType = ST_NONE;  
             m_hSocket = INVALID_SOCKET;  
         }  
         return RET_ESUC;  
     }  

正是我想说的,你的接口其实不简单,而且似乎很复杂
你应该提供的是库,可是却很多限制,难免让使用者畏手畏脚,不过精神值得肯定!
  相关解决方案