【vc++精品源码栏目提醒】:网学会员为广大网友收集整理了,一个简单的IOCP - 其它资料,希望对大家有所帮助!
一个简单的 IOCP(IO 完成端口)服务器/客 户端类1/2 http://tech.ddvip.com 2008 年 12 月 06 日 社区交流 关键字: 进制转换 BizTalk LinkedList TreeView KTDictSeg 源代码使用比较高级的 IOCP 技术,它能够有效的为多个客户端服务,利用 IO CP 编程 API,它也提供了一些实际问题的解决办法,并且提供了一个简单的带回复 的文件传输的客户端/服务器。
1.1 要求: l 文章要求读者熟悉 C TCP/IP 套接字socket编程 MFC 和多线程。
l 源代码使用 Winsock 2.0 和 IOCP 技术,并且要求: Windows NT/2000 or later: Requires Windows NT 3.5or later. Windows 95/98/ME: 不支持 Visual C .NET or a fully updated Visual C 6.0. 1.2 摘要: 在你开发不同类型的软件,不久之后或者更晚,你必须得面对客户端/服务器端的发展。
对程序员来说,写一个全面的客户端/服务器的代码是很困难的。
这篇文章提供了一个简单的,但却强大的客户端/服务器源代码,它能够被扩展到许多客户端/服务器的应用程序中。
源代码使用高级的 IOCP 技术,这种技术能高效的为多个客户端提供服务。
IOCP 技术提供了一种对 一个线程—一个客户端(one-thread-one client)这种瓶颈问题(很多中问题的一个)的有效解决方案。
它使用很少的一直运行的线程和异步输入/输出,发送/接收。
IOCP 技术被广泛应用于各自高性能的服务器,像 Apache 等。
源代码也提供了一系列的函数,在处理通信、客户端/服务器接收/发送文件函数、还有线程池处理等方面都会经常用到。
文章主要关注利用 IOCP 应用 API 函数的实际解决方案,也提供了一个全面的代码文档。
此外,也为你呈现了一个能处理多个连接、同时能够进行文件传输的简单回复客户端/服务器。
2.1. 介绍: 这片文章提供了一个类,它是一个应用于客户端和服务器的源代码,这个类使用 IOCP 和异步函数,我们稍后会进行介绍。
这个源代码是根据很多代码和文章得到的。
利用这些简单的源代码,你能够: l 服务/连接多个客户端和服务器。
异步发送和接收文件。
l 为了处理沉重的客户端/服务器请求,创建并管理一个逻辑工作者线程池。
(logical worker thread pool)。
我们很难找到充分的,但简单的能够应对客户端/服务器通信的源代码。
在网上发现的源代码即复杂(超过 20 个类),又不能提供足够的功能。
本问的代码尽量简单,也有好的文档。
我们将简要介绍 Winsock API 2.0 提供的IOCP 技术,编码时遇到的疑难问题,以及这些问题的应对方案。
2.2. 异步输入/输出完成端口(IOCP)简介 一个服务器应用程序,假如不能够同时为多个客户端提供服务,那它就没有什么意义。
通常的异步 I/O 调用,还有多线程都是这个目的。
准确的说,一个异步 I/O 调用能够立即返回,尽管有阻塞的 I/O 调用。
同时,I/O 异步调用的结果必须和主线程同步。
这可以用很多种方法实现,同步可以通过下面方法实现: l 利用事件——当异步调用完成时设定的信号。
这种方法的优点是线程必须检查和等待这个信号被设定。
l 使用 GetOverlappedResult 函数——这个方法和上面方法有相同的优点。
l 使用异步程序调用(APC)——这种方法有些缺点。
第一,APC 总是在正被调用的线程的上下文中被调用;第二,调用线程必须暂停,等待状态的改变。
l 使用 IOCP——这种方法的缺点是有些疑难问题必须解决。
使用 IOCP 编码多少有些挑战。
2.2.1 为什么使用 IOCP 使用 IOCP, 我们知道, 我们能够克服 一个线程 —— 一个客户端 问题。
假如软件不是运行在一个真实的多处理器机器上,它的性能会严重下降。
线程是系统的资源,它们即不是无限的,也不便宜。
IOCP 提供了一种利用有限的(I/O 工作线程)公平的处理多客户端的输入/输出问题的解决办法。
线程并不被阻塞,在无事可作的情况下也不使 CPU 循环。
2.3. 什么是 IOCP 我们已经知道,IOCP 仅仅是一个线程同步对象,有点像信号量(semaphore),因此 IOCP 并不是一个难懂的概念。
一个 IOCP 对象和很多支持异步 I/O 调用的