AcceptEx函数的定义如下:

BOOL AcceptEx ( 
  SOCKET sListenSocket,      
  SOCKET sAcceptSocket,      
  PVOID lpOutputBuffer,      
  DWORD dwReceiveDataLength,  
  DWORD dwLocalAddressLength,  
  DWORD dwRemoteAddressLength,  
  LPDWORD lpdwBytesReceived,  
  LPOVERLAPPED lpOverlapped  
);

参数1--sListenSocket, accept前绑定到本地地址的监听socket,一般由listen()得到
参数2--sAcceptSocket, 用于接受连接的socket,本人理解应该更主要是的一个out参数。
参数3--lpOutputBuffer,一块内存,当Accept成功时,会有本地(server)的地址信息,
       远端地址信息(client),可能还有数据(当dwReceiveDataLength!=0时)将得到。此参数将存放这
 3种信息,其中,它们是这样存放的:开始dwReceiveDataLength个大小,用于存放Accept时接到
 到的数据,后面接着存放server的地址,接着是client的地址信息。该参数比较重要,如果使用
 不当,可能会引起内存溢出。
参数4--dwReceiveDataLength,lpOutputBuffer中用于存放数据的空间大小。如果此参数=0,则Accept时
 将不会待数据到来,而直接返回,所以通常当Accept有数据时,该参数设成为:
 sizeof(lpOutputBuffer)(实参的实际空间大小) - 2*(sizeof sockaddr_in +16)。

参数5--dwLocalAddressLength,存放本地址地址信息的空间大小
参数6--dwRemoteAddressLength,存放本远端地址信息的空间大小
参数7--lpdwBytesReceived,out参数,用于存放接收到的数据长度。该参数只是在同步IO的时候会有效
 返回,如果是异步的重叠IO,需从完成通知信息里面得到。(详见MSDN)
参数8--lpOverlapped,标识异步操作时的重叠IO结构信息。

摘自:http://www.cnblogs.com/shine1592/archive/2008/10/23/1317695.html

使用此函数时,要包含头文:Mswsock.h,同时要链接:Mswsock.lib。可在源程序中加入下面的语句,这样在编译时,将自动链接Mswsock.lib。

  #pragma comment(lib,” Mswsock.lib”)
  

  下面是使用AcceptEx函数的示例代码:

  #define STRICT

  #define _WIN32_WINNT 0x0500 // Windows 2000 or later

  #define WIN32_LEAN_AND_MEAN

  
  #include

  #include

  #include

  
  #pragma comment(lib,"Ws2_32.lib")

  #pragma comment(lib,"Mswsock.lib")
  int main()

  {

  const int BUFSIZE = 48;

  LPFN_ACCEPTEX lpfnAcceptEx = NULL;

  GUID GuidAcceptEx = WSAID_ACCEPTEX;

  DWORD dwBytes = 0;

  SOCKET ListenSocket = INVALID_SOCKET;

  SOCKET ClientSocket = INVALID_SOCKET;

  HANDLE hCompPort = INVALID_HANDLE_VALUE;

  OVERLAPPED ol;

  char buf[BUFSIZE];

  
  // Init WinSock Lib ....
  

  ListenSocket = WSASocket(AF_IPX, SOCK_STREAM, NSPROTO_SPX, NULL, 0, WSA_FLAG_OVERLAPPED);

  ClientSocket = WSASocket(AF_IPX, SOCK_STREAM, NSPROTO_SPX, NULL, 0, WSA_FLAG_OVERLAPPED);
  

  // Bind && Listen ....

  
  // Associate the listening socket with the completion port

  CreateIoCompletionPort((HANDLE)ListenSocket, hCompPort, (u_long)0, 0);
 
  
  // Get AccpetEx Function

  WSAIoctl(ListenSocket,

  SIO_GET_EXTENSION_FUNCTION_POINTER,

  &GuidAcceptEx,

  sizeof(GuidAcceptEx),

  &lpfnAcceptEx,

  sizeof(m_WorkInfo.AcceptInfo.lpfnAcceptEx),

  &dwBytes,

  NULL,

  NULL

  );

  
  ZeroMemory(buf,BUFSIZE);

  ZeroMemory(&ol,sizeof(OVERLAPPED));
  // Post Accept Message

  lpfnAcceptEx(ListenSocket,

  ClientSocket,

  buf,

  0,

  sizeof(SOCKADDR_IN) + 16,

  sizeof(SOCKADDR_IN) + 16,

  &dwBytes,

  &ol

  );

  }

  需要注意的是,通过WSAIoctl获取AcceptEx函数指针时,只需要传递给WSAIoctl一个有效的SOCKET即可,该Socket的类型不会影响获取的AcceptEx函数指针。

  如果不希望AcceptEx建立连接后等待用户发送数据,那么必须将第四个参数设为0。第5、6参数必须是对应SOCKET的地址类型的大小再加上16个字节。

  为了使服务器能较好的处理用户连接请求,可采取如下两种策略:

  A.设定两个界限值,使系统未处理的Accept操作保持在一个固定水平。推荐上限为10;

  B.通过WSAEventSelect函数监听ListenSocket上的FD_ACCEPT事件。

  当关闭完成端口时,如果还有未处理的Accepte操作,应该先关闭ListenSocket,然后在IOCP中,处理这些Accept操作(进行资源释放等),切记不要强行终止那些没有处理的Accept操作,否则会造成内存泄漏。
  
  为防止恶意用户(建立连接后,不发送数据),可设置ListenSocket的SO_CONNECT_TIME属性。
  
  如果希望ClientSocket具有和ListenSocket相同的属性,需要对ClientSocket调用SO_UPDATE_ACCEPT_CONTEXT。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Civet148/archive/2006/06/03/771954.aspx

AcceptEx浅析相关推荐

  1. c语言 accept,AcceptEx浅析(转)

    AcceptEx函数的定义如下: BOOL AcceptEx ( SOCKET sListenSocket, SOCKET sAcceptSocket, PVOID lpOutputBuffer, D ...

  2. uicolor swift_Swift中的UIColor

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

  3. 浅析 JavaScript 中的 函数 uncurrying 反柯里化

    柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果. 因此柯里化的过程是 ...

  4. 浅析Python中bytes和str区别

    本博转载自:Chown-Jane-Y的浅析Python3中的bytes和str类型 Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示, ...

  5. 学习《Linux设备模型浅析之设备篇》笔记(深挖一)

    这篇文章既然说了是浅析,那就是跳过了一些东西,我们把这些跳过的东西给它尽可能的补回来 今天登陆 lxr.free-electrons.com 发现内核版本已经升级到3.15了,那以后都使用3.15的源 ...

  6. 学习《Linux设备模型浅析之设备篇》笔记(一)

    最近在学习Linux设备模型,前面几篇文章也是读这篇的时候遇到问题,然后为了搞清楚先转去摸索才写出来的. 当然了,刚开始是先读到<Linux那些事儿之我是Sysfs>,搞不清楚才去读的&l ...

  7. 架构周报| 浅析MySQL JDBC连接配置上的两个误区

    经典案例 \\ 浅析MySQL JDBC连接配置上的两个误区:相信使用MySQL的同学都配置过它的JDBC驱动,多数人会直接从哪里贴一段URL过来,然后稍作修改就上去了,对应的连接池配置也是一样的,很 ...

  8. 超级账本(Hyperledger Fabric)之权限管理浅析

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 超级账本(Hyperledger Fabric)之权限管理浅析 超级账本是联盟链的代表,而其相对于共链(例如比特币,以太 ...

  9. linux内核SMP负载均衡浅析

    需求       在<linux进程调度浅析>一文中提到,在SMP(对称多处理器)环境下,每个CPU对应一个run_queue(可执行队列).如果一个进程处于TASK_RUNNING状态( ...

最新文章

  1. FreeBSD 6.0架设管理与应用-附录B 制作FreeBSD安装光盘
  2. mysql 下载地址及安装教程
  3. 关于《Java编程思想》的简单纠正
  4. 业界首发丨网易云信虚拟人解决方案,首创客户端+云端双渲染技术
  5. numpy不用科学记数发 python_Python科学计算库Numpy常用的函数使用
  6. python反转列表不用切片_关于python:使用切片表示法反转列表
  7. C#LeetCode刷题之#561-数组拆分 I(Array Partition I)
  8. JAVA学生信息管理系统IO流版
  9. 原生javascript淡入淡出焦点图 + Jquery实现方法
  10. C/C++排序算法(4)快速排序
  11. mysql外建名是随机的吗_创建角色随机名字(mysql抽取随机记录)和mysql游标的使用_MySQL...
  12. Tensflow学习笔记(一)——TF生成并查看数据
  13. 2021李宏毅机器学习课程笔记——Auto Encoder
  14. 6410 android 4.4.2,365备用「永久地址0365.tv」飞凌嵌入式开发板飞凌i.MX6开发板 Android 系统编译...
  15. 利用TreeView控件动态生成无限级树(续:通过绑定动态xml文件)(转)
  16. flash 转 html5 工具_转
  17. java webservice请求参数_Java调用WebService的方法总结
  18. 3维图像处理的新星--Open3D(实操过程持续更新ing....
  19. 如何做好电商平台的内容运营?
  20. MATLAB中字体大小颜色设置

热门文章

  1. 浅析QuickBI为何能成为国内首个入选Gartner魔力象限的BI产品
  2. 最“热乎”的蚂蚁Java社招面试经历分享(共40个面试题)
  3. 学习BLAS库 -- BLAS库简介
  4. 单因子 amp; 多因子策略(基于JoinQuant)
  5. 常见文件上传漏洞利用
  6. 数字图像处理matlab作业,数字图像处理matlab大作业
  7. 由select/epoll返回的非阻塞connect还会是EINPROGRESS状态吗?
  8. C# 之 WPF 统计图表开发方案
  9. 创业公司后台技术栈搭建方案
  10. 字符串含有某个字符的个数