用完成端口开发大响应规模的Winsock应用程序

通常要开发网络应用程序并不是一件轻松的事情,不过,实际上只要掌握几个关键的原则 也就可以了——创建和连接一个套接字,尝试进行连接,然后收发数据。真正难 的是要写出一个可以接纳少则一个,多则数千个连接的网络应用程序。本文将讨论如何通过 Winsock2在Windows NT 和 Windows 2000上开发高扩展能力的Winsock应用程序。文章主要的 焦点在客户机/服务器模型的服务器这一方,当然,其中的许多要点对模型的双方都适用。

API与响应规模

通过Win32的重叠I/O机制,应用程序可以提请一项I/O操作,重叠 的操作请求在后台完成,而同一时间提请操作的线程去做其他的事情。等重叠操作完成后线 程收到有关的通知。这种机制对那些耗时的操作而言特别有用。不过,像Windows 3.1上的 WSAAsyncSelect()及Unix下的select()那样的函数虽然易于使用,但是它们不能满足响应规 模的需要。而完成端口机制是针对操作系统内部进行了优化,在Windows NT 和 Windows 2000上,使用了完成端口的重叠I/O机制才能够真正扩大系统的响应规模。

完成端口

一个完成端口其实就是一个通知队列,由操作系统把已经完成的重叠I/O请求的通知 放入其中。当某项I/O操作一旦完成,某个可以对该操作结果进行处理的工作者线程就会收到 一则通知。而套接字在被创建后,可以在任何时候与某个完成端口进行关联。

通常情 况下,我们会在应用程序中创建一定数量的工作者线程来处理这些通知。线程数量取决于应 用程序的特定需要。理想的情况是,线程数量等于处理器的数量,不过这也要求任何线程都 不应该执行诸如同步读写、等待事件通知等阻塞型的操作,以免线程阻塞。每个线程都将分 到一定的CPU时间,在此期间该线程可以运行,然后另一个线程将分到一个时间片并开始执行 。如果某个线程执行了阻塞型的操作,操作系统将剥夺其未使用的剩余时间片并让其它线程 开始执行。也就是说,前一个线程没有充分使用其时间片,当发生这样的情况时,应用程序 应该准备其它线程来充分利用这些时间片。

完成端口的使用分为两步。首先创建完成 端口,如以下代码所示:

HANDLE  hIocp;
hIocp = CreateIoCompletionPort(
  INVALID_HANDLE_VALUE,
  NULL,
   (ULONG_PTR)0,
  0);
if (hIocp == NULL) {
  // Error
}

完成端口创建后,要把将使用该完成端口的套接字与之关联起来。方法是再次调用 CreateIoCompletionPort ()函数,第一个参数FileHandle设为套接字的句柄,第二个参数 ExistingCompletionPort 设为刚刚创建的那个完成端口的句柄。

以下代码创建了一 个套接字,并把它和前面创建的完成端口关联起来:SOCKET  s;
s = socket (AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET) {
  // Error
if (CreateIoCompletionPort((HANDLE)s,
              hIocp,
              (ULONG_PTR)0,
              0) == NULL)
{
// Error
}
...
}

时间: 2024-09-04 23:45:26

用完成端口开发大响应规模的Winsock应用程序的相关文章

用完成端口设计大响应规模地Winsock运用程序

通常要开发网络应用程序并不是一件轻松的事情,不过,实际上只要掌握几个关键的原则也就可以了--创建和连接一个套接字,尝试进行连接,然后收发数据.真正难的是要写出一个可以接纳少则一个,多则数千个连接的网络应用程序.本文将讨论如何通过Winsock2在Windows NT 和 Windows 2000上开发高扩展能力的Winsock应用程序.文章主要的焦点在客户机/服务器模型的服务器这一方,当然,其中的许多要点对模型的双方都适用.   API与响应规模 通过Win32的重叠I/O机制,应用程序可以提请

用c# 开发大华网络摄像头 sdk包第一次用 完全看不懂啊

问题描述 用c# 开发大华网络摄像头 sdk包第一次用 完全看不懂啊 用c# 在网页上能用摄像头监控 但是大华给的sdk 也是第一次用 完全不会用 怎么办 解决方案 你是开发者还是最终用户?如果是前者,你本身没有什么专业技能的问题,出于可以理解的原因,你完全有理由,有资格直接联系厂家给你技术支持:如果是后者,不要逞能,你应该找软件公司为你开发,而不是自己越俎代庖. 解决方案二: 看文档.看示例代码.再不行,找厂家的技术支持. 解决方案三: 仔细看看主要的DLL和函数使用说明,摄像头控制一般都用的

android开发-大神求助。中国天气预报接口不能用了吗?

问题描述 大神求助.中国天气预报接口不能用了吗? 真是奇怪了,返回的JSON数据可以解析出天气描述和两个温度,但是城市名字,发布日期,都解析不出来...开发-大神求助.中国天气预报接口不能用了吗?-天气预报接口"> 解决方案 是不是接口调用错了啊,城市名称的key正确吗,信息天气信息应该都是全的. 解决方案二: 不会啊,,我用webService调用可以显示城市名和发布日期啊 解决方案三: 应该可以 使用,检查一下城市名是否准确. 解决方案四: 天气预报接口

移动开发-大神们求教自定义listview固定头部和尾部不动中间item数据可以上下滑动。

问题描述 大神们求教自定义listview固定头部和尾部不动中间item数据可以上下滑动. 求教自定义listview固定头部和尾部不动中间item数据可以上下滑动,最好是能封装成一个view开发-大神们求教自定义listview固定头部和尾部不动中间item数据可以上下滑动.-listview滑动隐藏头部"> 解决方案 在listview中加入header 和footer. 在listview里面有的 public void addHeaderView (View v) public v

AdTime:开发大数据新能源助力信息消费

文章讲的是AdTime:开发大数据新能源助力信息消费,无可厚非,大数据在社会生活中的运用将会越来越多,未来大到国家安全小到个人决策,都将离不开大数据的支持.从很多角度上来看,大数据具备新能源的很多特征,一是可再生,可重复利用,二是清洁高效.数据资源将会逐渐成为除太阳能.风能.生物质能等之外的另一种新能源,被各行各业广泛使用.能源与社会经济发展息息相关,特别对信息消费领域的促进十分巨大. 如其他新能源一样,大数据本身不具备太多价值,但对这些数据进行开发与利用后,会在很多层面中发挥巨大作用.同时,所

Windows Phone 8初学者开发—第6部分:设置应用程序的样式

原文 Windows Phone 8初学者开发-第6部分:设置应用程序的样式 Source Code: http://aka.ms/absbeginnerdevwp8 PDF Version: http://aka.ms/absbeginnerdevwp8pdf   我们已经讨论了XAML基础.布局以及事件,让我们在本课中讨论一些有趣的议题.我们将通过设置应用程序的样式赋予应用程序独特的特征.显然我们要遵循微软的准则以使我们的应用程序看上去是Windows Phone 8生态系统的一部分,但是我

Windows Phone 8初学者开发—第16部分:使用应用程序栏

原文 Windows Phone 8初学者开发-第16部分:使用应用程序栏 原文地址:  http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners/Part-16-Working-with-the-Application-Bar 系列地址: http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Be

开发连接远程SQL Server 的ASP程序应注意的问题

Microsoft SQL Server7.0是一种大型.分布式数据库系统,也可被认为是一种大型.分布式数据仓库.由于其与Windows NT和BackOffice以及Visual Studio具有紧密的配合,已被越来越多的网络应用系统所采用.而ASP程序也以其和NT的紧密连接,可使用ActiveX对象.CGI接口对象化等特点向CGI程序发起了有力的挑战.下面,就谈谈开发连接远程SQL Server 的ASP程序应注意的几个问题. SQL Server是一个十分注重安全性的数据库,特别是在7.0

Ubuntu开发自己的包格式和安装程序

Canonical开发者正在开发自己的软件包格式和安装程序,补充而不是替代Debian的软件包管理工具apt/dpkg.新的软件包格式和安装程序仅用于新发行的软件包,也就是运行在Ubuntu Phone/Tablet上的第三方应用,其最主要特性是应用程序之间没有依赖关系-- 即应用程序所需要的库都捆绑在软件包内,每个程序都安装在自己的目录下,整个包格式将纯粹是说明性的.Canonical开发者Colin Watso强调,他们会继续用 dpkg和apt构建Ubuntu操作系统,同步Debian.