转自:http://blog.csdn.net/zhongguoren666/article/details/7858588

1. accept、WSAAccept是同步操作,AcceptEx是异步操作

2. WSAAccept函数早accept函数基础上添加了条件函数判断是否接受客户端连接

3. AcceptEx是异步的,可以同时发出多个AcceptEx请求,支持重叠IO操作.

转自:http://www.2cto.com/net/201107/96401.html

接受连接请求
服务器要做的最普通的事情之一就是接受来自客户端的连接请求。在套接字上使用重叠I/O接受连接的惟一API就是AcceptEx()函数。有趣的是,通常的同步接受函数accept()的返回值是一个新的套接字,而AcceptEx()函数则需要另外一个套接字作为它的参数之一。这是因为AcceptEx()是一个重叠操作,所以你需要事先创建一个套接字(但不要绑定或连接它),并把这个套接字通过参数传给AcceptEx()。以下是一小段典型的使用AcceptEx()的伪代码:

do {
    -等待上一个 AcceptEx 完成
    -创建一个新套接字并与完成端口进行关联
    -设置背景结构等等
    -发出一个 AcceptEx 请求
}while(TRUE);
作为一个高响应能力的服务器,它必须发出足够的AcceptEx调用,守候着,一旦出现客户端连接请求就立刻响应。至于发出多少个AcceptEx才够,就取决于你的服务器程序所期待的通信交通类型。比如,如果进入连接率高的情况(因为连接持续时间较短,或者出现交通高峰),那么所需要守候的AcceptEx当然要比那些偶尔进入的客户端连接的情况要多。聪明的做法是,由应用程序来分析交通状况,并调整AcceptEx守候的数量,而不是固定在某个数量上。
对于Windows2000,Winsock提供了一些机制,帮助你判定AcceptEx的数量是否足够。这就是,在创建监听套接字时创建一个事件,通过WSAEventSelect()这个API并注册FD_ACCEPT事件通知来把套接字和这个事件关联起来。一旦系统收到一个连接请求,如果系统中没有AcceptEx()正在等待接受连接,那么上面的事件将收到一个信号。通过这个事件,你就可以判断你有没有发出足够的AcceptEx(),或者检测出一个非正常的客户请求(下文述)。这种机制对Windows NT 4.0不适用。
使用AcceptEx()的一大好处是,你可以通过一次调用就完成接受客户端连接请求和接受数据(通过传送lpOutputBuffer参数)两件事情。也就是说,如果客户端在发出连接的同时传输数据,你的AcceptEx()调用在连接创建并接收了客户端数据后就可以立刻返回。这样可能是很有用的,但是也可能会引发问题,因为AcceptEx()必须等全部客户端数据都收到了才返回。具体来说,如果你在发出AcceptEx()调用的同时传递了lpOutputBuffer参数,那么AcceptEx()不再是一项原子型的操作,而是分成了两步:接受客户连接,等待接收数据。当缺少一种机制来通知你的应用程序所发生的这种情况:“连接已经建立了,正在等待客户端数据”,这将意味着有可能出现客户端只发出连接请求,但是不发送数据。如果你的服务器收到太多这种类型的连接时,它将拒绝连接更多的合法客户端请求。这就是黑客进行“拒绝服务”攻击的常见手法。
要预防此类攻击,接受连接的线程应该不时地通过调用getsockopt()函数(选项参数为SO_CONNECT_TIME)来检查AcceptEx()里守候的套接字。getsockopt()函数的选项值将被设置为套接字被连接的时间,或者设置为-1(代表套接字尚未建立连接)。这时,WSAEventSelect()的特性就可以很好地利用来做这种检查。如果发现连接已经建立,但是很久都没有收到数据的情况,那么就应该终止连接,方法就是关闭作为参数提供给AcceptEx()的那个套接字。注意,在多数非紧急情况下,如果套接字已经传递给AcceptEx()并开始守候,但还未建立连接,那么你的应用程序不应该关闭它们。这是因为即使关闭了这些套接字,出于提高系统性能的考虑,在连接进入之前,或者监听套接字自身被关闭之前,相应的内核模式的数据结构也不会被干净地清除。
发出AcceptEx()调用的线程,似乎与那个进行完成端口关联操作、处理其它I/O完成通知的线程是同一个,但是,别忘记线程里应该尽力避免执行阻塞型的操作。Winsock2分层结构的一个副作用是调用socket()或WSASocket() API的上层架构可能很重要(译者不太明白原文意思,抱歉)。每个AcceptEx()调用都需要创建一个新套接字,所以最好有一个独立的线程专门调用AcceptEx(),而不参与其它I/O处理。你也可以利用这个线程来执行其它任务,比如事件记录。
有关AcceptEx()的最后一个注意事项:要实现这些API,并不需要其它提供商提供的Winsock2实现。这一点对微软特有的其它API也同样适用,比如TransmitFile()和GetAcceptExSockAddrs(),以及其它可能会被加入到新版Windows的API. 在Windows NT和2000上,这些API是在微软的底层提供者DLL(mswsock.dll)中实现的,可通过与mswsock.lib编译连接进行调用,或者通过WSAIoctl() (选项参数为SIO_GET_EXTENSION_FUNCTION_POINTER)动态获得函数的指针。
如果在没有事先获得函数指针的情况下直接调用函数(也就是说,编译时静态连接mswsock.lib,在程序中直接调用函数),那么性能将很受影响。因为AcceptEx()被置于Winsock2架构之外,每次调用时它都被迫通过WSAIoctl()取得函数指针。要避免这种性能损失,需要使用这些API的应用程序应该通过调用WSAIoctl()直接从底层的提供者那里取得函数的指针。

AcceptEx WSAAccept accept相关推荐

  1. uicolor swift_Swift中的UIColor

    uicolor swift UIColor (UIColor) An object that stores color data and sometimes opacity. 存储颜色数据和有时不透明 ...

  2. 完成端口与AcceptEx

    关于IOCP网上到处都是资料,说的也很详细.我在这里就不再多说了,这只是本人在学习IOCP时的笔记,和配合AcceptEx写的一个极小的服务端程序.由于刚刚接触ICOP加上本人刚毕业不到一年,所以里面 ...

  3. AcceptEx与完成端口(IOCP)结合实例

    前言 在windows平台下实现高性能网络服务器,iocp(完成端口)是唯一选择.编写网络服务器面临的问题有:1 快速接收客户端的连接.2 快速收发数据.3 快速处理数据.本文主要解决第一个问题. A ...

  4. WinSock I/O 模型 -- WSAEventSelect 模型

    简介 WSAEventSelect 模型也是 WinSock 中最常见的异步 I/O 模型. 这篇文章我们就来看看如何使用 WSAEventSelect api 来实现一个简单的 TCP 服务器. A ...

  5. Windows io完成端口

    Windows 提供一种称为I/O完成端口(I/O Completion Port)机制,能够让I/O的完成处理交由一个专门的线程池来完成,而线程池的线程数量是一个可配置的参数.这种做法将I/O请求的 ...

  6. 完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三

       手把手叫你玩转网络编程系列之三    完毕port(Completion Port)具体解释                                                    ...

  7. apache php 调优_记一次apache+php调优

    近日手头拿到了一个调优问题,详细一看,发现是apache+php问题,问题的具体表现如下: 正常运行的服务常常停止响应, 一旦停止响应, 维护人员就不得己需要去重启apache服务 对php不熟,调查 ...

  8. 手把手教你玩转SOCKET模型:完成端口(Completion Port)详解

    这篇文档我非常详细并且图文并茂的介绍了关于网络编程模型中完成端口的方方面面的信息,从API的用法到使用的步骤,从完成端口的实现机理到实际使用的注意事项,都有所涉及,并且为了让朋友们更直观的体会完成端口 ...

  9. 完成端口(Completion Port)详解----- By PiggyXP(小猪)

    本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中--酝酿了两年之后,终于决定开始动笔了,但愿还不算晚-.. 这篇文档我非常详细并且图文并 ...

最新文章

  1. 传统数据仓库架构与Hadoop的区别
  2. JQuery图片加载显示loading和加载失败默认图片
  3. mysql免安装版鞋子_MySQL创建用户及授权
  4. UNIX再学习 -- 系统数据文件和信息
  5. [html] 说下你对组件、模块、元素的理解,它们的区别在哪里?
  6. 看!闲鱼在ServiceMesh的探索和实践
  7. 安卓 删除事件弹出消息框_微信更新,朋友圈可以删除好友评论了?网友:杠精终于可以删了...
  8. Android SDK下载网址
  9. python pdf转txt_Python实现pdf文档转txt的方法示例
  10. 【学生信息管理系统】-优化篇1
  11. 计算机软件工程职业道德论文,软件工程职业道德论文_软件工程_软件工程就业前景...
  12. Java刷题面试系列习题(三)
  13. 开放共赢 | 美格智能高通物联网技术开放日成功举办
  14. 腾讯通信云服务端使用心得,腾讯云IM
  15. 2353410-03-2,TCO-PEG8-acid末端羧酸(CO2H)可在活化剂(例如EDC或HATU)存在下与伯胺基反应以形成稳定键
  16. 如何考上复旦大学研究生
  17. 学钢琴时如何提高识谱能力
  18. TINA导入Ti官网器件
  19. 图像处理(二十三)基于调色板的图像Recoloring-Siggraph 2015
  20. 让五个数都不相等的程序c语言,C语言程序设计课件第05讲.ppt

热门文章

  1. 多目标优化算法:基于非支配排序的麻雀搜索算法(Non-Dominated Sorting Sparrow Search Algorithm,NSSSA)
  2. vba数组如何精确筛选_VBA数组与字典解决方案第10讲:数组及数组公式的制约性和集合性二...
  3. keepalived persistence_timeout参数意义 LVS Persistence 参数的作用
  4. 大家知道不接收微信的“通过手机号添加的好友申请”要怎么弄吗
  5. IPv6排障工具之ping6完整过程细节剖析
  6. Android随笔-指纹识别
  7. 汽车无钥匙启动技术简介
  8. MWC 2017大会的10款热门物联网产品
  9. chatgpt智能提效职场办公-ppt怎么做流程图
  10. 410_Arduino UNO库模块梳理