`
qepwqnp
  • 浏览: 108876 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

再次封装IOCP的收获

阅读更多

以前写过一篇用python封装IOCP的文章,这几天因朋友需要,再一次封装了iocp接口。这一次我并不是简单的把原有代码拿过来简单的修修改改,基本上是推到重来。改正第一次封装时的许多缺点,同时修正了许多bug,再回首看以前的代码,感觉自己在进步。这次封装iocp,收获了以下几点知识:

1. 数据的重复投递。一般情况下,一个Socket句柄在同一时刻最多只能有一次WSASend与SWARecv,如果多次投递WSASend或者WSARecv,有可能造成数据的重复发送或重复接收。我一般为每个Socket创建两个buffer,一个用于发送数据(send buffer),别一个用于接收数据(recv buffer),当send buffer中有数据的时候,就投递WSASend,如果send buffer为空,则不投递,且保证任何时刻该Socket只有一次WSASend投递。同样,当recv buffer满的时候,不投递WSARecv,如果recv buffer有空闲空间,就投递WSARecv投,且保证同一时刻该Socket只有一次WSARecv递。

2. 如果WSARecv或WSASend投递失败,将不会接收到通知。如:if (WSARecv(sock, …) == SOCKET_ERROR && err_no != WSA_IO_PENDING) { // 投递失败,不会为这次投递发送通知。 }

3. 关于连接断开时接收到的通知。如果iocp检测到Socket连接已经断开,程序马上会收得到通知,而且有时候会收到不至一次通知,这取决于你在该socket上投递WSASend与WSARecv的次数。例如你在一个socket上投递了一次WSASend与一次WSARecv,在这两次投递还没有被完成时,如果socket断开了连接,那么GetQueuedCompletionStatus()将会收到两次通知。一般情况下,我们会为每个连接准备两个重叠IO结构(Overlapped struct),一个用于接收数据,另一个用于发送数据。当连接断开的时候,就应该正确地释放这些资源。

4. 对于Socket的管理。一般情况下,使用字典或者列表来管理所有的连接。以字典为例,当连接创建的时候,将连接加入到字典中,而连接断开的时候,将连接从字典中移除。因为IOCP可能有多个工作者线程,所以在执行上述操作时,应该保证操作的原子性,也就是多线程同步问题。例如:一个工作者线程正在对一个连接投递WSASend操作,而同时另一个工作者线程检测到这个连接已经断开,并将该连接从字典中移除,并释放了与该连接相关的资源,此时就会出现不可预知的情况。

5. 关于IOCP的性能。网上有一些文章说IOCP能同时处理上万个连接,但我写的IOCP程序根本无法达到这个数,于是对IOCP的性能进行了怀疑。其实,经过我的调试发现,IOCP的效率确实高,处理上万个连接应该没问题,至于为什么自己的程序没有能达到这个数量级,我觉得主要是我的程序要维护成百上千个连接的缘故。我用hash_map来管理所有的连接,在程序中经常要根据key来获取相应的数据结构,如果很频繁的调用这样的操作,是会引起性能问题的。可以写一个简单的C++程序来感受一下:

// 下面这段代码在VC下是很占资源的
map<int, int> dict;
for (int i = 0; i < 1000; ++i)
	dict[i] = i;

while (1) {
	for (int i = 0; i < 1000; ++i) {
		dict[i];
	}
	Sleep(10);
}

上面这些内容是我第二次封装iocp所尝到的东西,网上还有许多关于iocp的好文章可供参考。如果您需要iocp的python封装版本,请留下您的邮箱,也欢迎与我交流。

分享到:
评论

相关推荐

    ACE IOCP封装

    "ACE IOCP封装"就是针对这样的需求而提出的一种技术解决方案。ACE(Adaptive Communication Environment)是一个跨平台的C++库,它提供了丰富的网络编程接口,能够帮助开发者高效地构建分布式系统。而IOCP(I/O完成...

    iocp封装demo

    在这个"iocp封装demo"中,我们将会探讨如何将IOCP技术封装到一个易于理解和使用的类中。 首先,理解IOCP的基本概念至关重要。IOCP是Windows API提供的一种机制,用于通知应用程序I/O操作已经完成。当一个异步I/O...

    一个对IOCP进行封装的DLL

    标题中的“一个对IOCP进行封装的DLL”指的是一个动态链接库(DLL)文件,它将Windows操作系统中的I/O完成端口(I/O Completion Port,简称IOCP)进行了抽象和封装,使得开发者无需深入理解底层的IOCP机制,也能利用...

    iocp_c++11.rar_C++ iocp_IOCP 封装_c++ 异步框架_c++iocp封装_spentp2t

    iocp异步通信封装,适合中小型并发服务器框架,性能经测试还可以

    把完成端口IOCP封装成DLL.zip

    本文将深入探讨如何将IOCP封装成动态链接库(DLL),以便在多个应用程序中复用。 首先,我们需要理解IOCP的基本原理。IOCP是Windows系统提供的一种机制,它允许应用程序在一个单独的线程池中处理所有的I/O完成事件...

    windows iocp网络通讯库封装

    这个"windows iocp网络通讯库封装"显然是一个使用IOCP实现的C++库,它可能包含了客户端和服务器端的网络通信功能。下面将详细解释IOCP以及与之相关的技术。 1. **IOCP(Input/Output Completion Port)**: IOCP是...

    Iocp_V7,IOCP封装类(DLL)第七次改版.

    由于兼容问题,不再使用Lib形式的封装,使用DLL 去掉0缓冲,接收数据大小有限制 IOCP只负责接收前256字节,剩下的根据自定义协议(肯定知道包的大小)再recv 添加Connect函数,所以此IOCP不仅可以作为服务端,同时也可以作为...

    IOCP封装类。

    网上一个朋友的IOCP类,我现在在研究IOCP,但是发现这个类有些缺陷,但是不知道如何修改一遍提高性能,还有就是我做压力测试,发现这个类有内存泄露,总是以4K的大小在增长,希望懂IOCP的朋友帮忙看看~~

    公认不错的IOCP封装类

    标题中的“公认的不错IOCP封装类”指的是在服务器开发中,使用了IO完成端口(Input/Output Completion Port,简称IOCP)技术进行高度优化的一种网络通信库。IOCP是Windows操作系统提供的一种高效的异步I/O模型,尤其...

    IOCP封装类,用VC6.0封装的

    IOCP_V5.rar(20110208) 服务端: 取消监听线程,采用AcceptEx异步接收套接字,效率更高 支持大量并发连接不丢包 压力测试后尚未发现内存泄露 IOCP_V4.rar(20110208) 服务端: 代码更加稳定,取消监听线程的异常处理 删减...

    高度封装的 IOCP库

    决定写一个IOCP,封装的很好的,这是一个库,请在VC2010下编译。 客户端和服务器都适用,但是只完成了TCP的部分,没有完成UDP的部分。 面向对象的方式编写。 包含连接器,内存管理,等模块。 无协议模块

    IOCP.rar_IOCP_IOCP 封装_visual c

    在标题“IOCP.rar_IOCP_IOCP 封装_visual c”中,我们可以理解为这是一个关于如何在Visual C++环境中封装并使用IOCP技术的资源包。** **IOCP(Input/Output Completion Port)的主要优点在于其能够显著提高多线程...

    VC6 IOCP封装类

    【标题】"VC6 IOCP封装类"是一个针对Windows操作系统中的I/O完成端口(Input/Output Completion Port,简称IOCP)进行封装的类库,适用于VC++ 6.0编程环境。IOCP是Windows系统提供的一种高效、异步的I/O模型,尤其...

    能接受超过65000个有效连接的IOCP封装类

    标题中的“能接受超过65000个有效连接的IOCP封装类”指的是一个经过优化的网络编程组件,能够处理大量的并发连接。在互联网服务中,尤其是高并发的服务器应用,如游戏服务器、流媒体服务等,需要处理的并发连接数...

    一个IOCP模型的socket封装类

    A simple application using IO Completion Ports and WinSock。老外写的IOCP封装类,使用了线程池和内存池。很不错的东西.资源里面有文档和例子程序

    iocp网络底层封装

    **iocp网络底层封装** 在Windows操作系统中,I/O完成端口(I/O Completion Port,简称IOCP)是一种高效的多线程并发I/O处理机制。它允许开发者将多个异步I/O操作关联到一个单一的完成端口,从而实现线程池的高效...

    IOCP.rar_IOCP_IOCP 封装_传输文件_完成端口_服务器

    标题中的“IOCP.rar_IOCP_IOCP 封装_传输文件_完成端口_服务器”表明这个压缩包包含了关于IOCP(I/O Completion Port,I/O完成端口)技术的实现,特别是关于如何封装IOCP以及如何用它来构建一个能够传输文件的服务器...

    IOCP 完成端口模型简单封装

    《IOCP完成端口模型简单封装详解》 IOCP(完成端口,英文名I/O Completion Ports)是一种在Windows操作系统中实现高并发网络通信的重要机制。它为高性能服务器设计提供了强大的支持,尤其适用于处理大量并发连接...

    经过封装的IOCP完成端口模型客户端

    "经过封装的IOCP完成端口模型客户端"是指开发人员已经将底层的IOCP机制进行了抽象和封装,提供了更易于使用的API,以便开发者能够更方便地实现客户端的网络通信功能,如发送文本数据、传输文件以及下载文件。...

    iocp-epoll

    iocp-epoll的几个例子,提供参考。 其中,iocp包含了几种使用方式,同步异步处理方式, epoll为linux下面使用,编译时可以使用下面简单命令, g++ -p -g -o hhh ***.cpp -l pthread

Global site tag (gtag.js) - Google Analytics