Windows套接字AcceptEx函数接受一个新的连接,返回本地和远程地址,并接收由客户端应用程序发送的第一块数据。Windows 95/98不支持AcceptEx函数。
平台SDK:Windows套接字
AcceptEx
注意:此函数是一个Microsoft特定的扩展,Windows Sockets规范。有关详细信息,请参阅Microsoft扩展和Windows Sockets 2。
BOOL AcceptEx(
IN SOCKET sListenSocket,
IN SOCKET sAcceptSocket,
IN PVOID lpOutputBuffer,
IN DWORD dwReceiveDataLength,
IN DWORD dwLocalAddressLength,
IN DWORD dwRemoteAddressLength,
OUT LPDWORD lpdwBytesReceived,
IN LPOVERLAPPED lpOverlapped
);
参数
sListenSocket
[in]侦听套接字。服务器应用程序在这个套接字上等待连接。
sAcceptSocket
[in]将用于连接的套接字。此套接字必须不能已经绑定或者已经连接。
lpOutputBuffer
[in]指向一个缓冲区,该缓冲区用于接收新建连接的所发送数据的第一个块、该服务器的本地地址和客户端的远程地 址。接收到的数据将被写入到缓冲区0偏移处,而地址随后写入。 该参数必须指定,如果此参数设置为NULL,将不会得到执行,也无法通过GetAcceptExSockaddrs函数获得本地或远程的地址。
dwReceiveDataLength
[in]lpOutputBuffer字节数,指定接收数据缓冲区lpOutputBuffer的大小。这一大小应不包括服务器的本地地址的大小或客户端的远程地址,他们被追加到输出缓冲区。如果dwReceiveDataLength是零,AcceptEx将不等待接收任何数据,而是尽快建立连接。
dwLocalAddressLength
[in]为本地地址信息保留的字节数。此值必须比所用传输协议的最大地址大小长16个字节。
dwRemoteAddressLength
[in]为远程地址的信息保留的字节数。此值必须比所用传输协议的最大地址大小长16个字节。 该值不能为0。
dwBytesReceived
[out]指向一个DWORD用于标识接收到的字节数。此参数只有在同步模式下有意义。如果函数返回ERROR_IO_PENDING并在迟些时候完成操作,那么这个DWORD没有意义,这时你必须获得从完成通知机制中读取操作字节数。
lpOverlapped
[in]一个OVERLAPPED结构,用于处理请求。此参数必须指定,它不能为空。
返回值
如果没有错误发生,AcceptEx函数成功完成并返回TRUE。[1] 
如果函数失败,AcceptEx返回FALSE。可以调用WSAGetLastError函数获得扩展的错误信息。如果WSAGetLastError返回ERROR_IO_PENDING,那么这次行动成功启动并仍在进行中。
备注
*在AcceptEx结合了几个socket函数的功能,acceptEx函数当成功时执行三项任务:
1. 一个新的连接被接受。
2. 返回连接的本地和远程地址。
3. 得到远程发送的第一个数据块
*较accept函数而言,程序使用AcceptEx可以更快连接到一个套接字
*输出缓冲区lpOutputBuffer存放内容包括:接收到的第一块数据、本地套接字地址(服务器)和远程套接字地址(客户端)。
使用单一的缓冲区可以提高性能,当使用AcceptEx时,必须使用GetAcceptExSockaddrs函数 将输出缓冲区的内容解析到三个不同部分的缓冲区 (data, local socket address, and remote socket address)。 在windows XP 及随后版本中,当 AcceptEx函数完成操作并且 SO_UPDATE_ACCEPT_CONTEXT选项在被接受的socket中被设置时, socket相关的本地地址(local address )可以使用getsockname函数获得。类似的,与被接受socket 相关的远程端地址(the remote address)可以使用getpeername函数获得。
*本地和远程地址缓冲区的大小必须比使用传输协议的sockaddr地址大16个字节,是因为是以内部格式写入。例如,一个SOCKADDR_IN大小(TCP / IP协议的地址结构)是16个字节。因此,本地和远程地址缓冲区的大小必须指定至少32个字节。
*AcceptEx函数使用的重叠I / O。与使用accept相比,使用AcceptEx能以相对较少的线程数量处理大量的客户。如同所有的Win32重叠函数,Win32事件或完成端口都可用来作为完成通知机制。
AcceptEx和accept函数的另一个主要区别是,AcceptEx函数需要调用者提供两个套接字参数:
一个指定监听套接字
一个指定接受连接的套接字
该sAcceptSocket参数必须是一个已经打开的socket,不能是已绑定或者是已连接的socket。
*GetQueuedCompletionStatus函数或GetOverlappedResult函数的lpNumberOfBytesTransferred参数表明该请求接收到的字节数。
当此操作成功完成,sAcceptSocket可以使用,但只限下列功能:
ReadFile
WriteFile
发送
recv
关闭套接字
注意:如果调用TransmitFile函数时,指定TF_DISCONNECT和TF_REUSE_SOCKET标志,指定套接字的已返回未绑定,未连接的状态。然后,您可以使用该套接字句柄作为AcceptEx函数的sAcceptSocket参数。但该套接字不能作为ConnectEx函数的参数。
当AcceptEx函数返回时,sAcceptSocket是一个已连接套接字。如未指定SO_UPDATE_ACCEPT_CONTEXT属性,sAcceptSocket不继承与sListenSocket参数相关套接字的属性。使用Setsockopt函数来设置SO_UPDATE_ACCEPT_CONTEXT选项,指定sAcceptSocket的套接字句柄和sListenSocket作为选项的值(specifying sAcceptSocketas the socket handle and sListenSocketas the option value) 。
例如:
error= setsockopt(sAcceptSocket,
SOL_SOCKET,
SO_UPDATE_ACCEPT_CONTEXT,
(char*)&sListenSocket,
sizeof(sListenSocket));
如果提供了数据接收缓冲区(dwReceiveDataLength!=0),异步操作将在连接建立并且接收到第一 块数据后完成。使用getsockopt的SO_CONNECT_TIME选项来检查连接是否已经接受。如果它已被接受,您可以判断连接建立多久。该选项 的返回值是套接字连接已建立的秒数。如果套接字未连接,getsockopt返回0xFFFFFFFF。应用程序通过检查SO_CONNECT_TIME并结合检查异步操作是否完成,可以确定是否连接已建立了一段时间但没有收到任何数据。我们建议您终止这些连接,可以通过关闭连接强制AcceptEx完成操作,并返回一个错误状态。
例如:
int seconds;
BYTE opt = sizeof(seconds);
error == getsockopt(sAcceptSocket,SOL_SOCKET,SO_CONNECT_TIME,
(char*)&seconds,(int)&opt);
if(error= NO_ERROR){
printf(“getsockopt(SO_CONNECT_TIME)失败:%d\ N”的,WSAGetLastError());
exit(1);
}
Notes for ATM
没有与连接设置相关的重要问题时,使用Windows套接字2异步传输模式(ATM)。请参阅Windows套接字2备注部分承担重要的ATM连接设置信息函数文档。

AcceptEx编辑的更多相关文章

  1. ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑

    前言: 为了赶进度,周末也写文了! 前几篇讲完查询框和工具栏,这节讲表格数据相关的操作. 先看一下列表: 接下来我们有很多事情可以做. 1:格式化 - 键值的翻译 对于“启用”列,已经配置了格式化 # ...

  2. java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis

    A 调用摄像头拍照,自定义裁剪编辑头像 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单;  技术:313596790freemaker模版技术 ,0个代码不用写 ...

  3. 好用的Markdown编辑器一览 readme.md 编辑查看

    https://github.com/pandao/editor.md https://pandao.github.io/editor.md/examples/index.html Editor.md ...

  4. Linux 中优秀的文本化编辑思想大碰撞(Markdown、LaTeX、MathJax)

    这样一个标题可能不太准确,因为确实无法准确地解释什么叫"文本化编辑思想".其实我这篇随笔主要是想探讨 Markdown.LaTeX.MathJax,有兴趣的朋友可以继续往下看,同时 ...

  5. php后台编辑关联数据

    数据库中两张表: info表中"民族"关联了nation表中的"code". php通过后台编辑info表中民族显示成用户可看懂及可直接修改的选项. 新建xin ...

  6. iOS 编辑UITableView(根据iOS编程编写)

    上个项目我们完成了 JXHomepwner 简单的应用展示,项目地址.本节我们需要在上节项目基础上,增加一些响应用户操作.包括添加,删除和移动表格. 编辑模式 UITableView 有一个名为  e ...

  7. C# 视频编辑

    VidCoder VidCoder是一个开源免费的DVD/蓝光视频抓取和转码软件.使用HandBrake做为编码引擎.比Handbrake拥有更友好的用户界面. 可裁剪.剪切.字幕编辑.转码等. 官网 ...

  8. [C1] C1ComboBox 的非编辑状态优化

    一.前言 先看看 WPF 自带的 ComboBox 在非编辑状态,自定义 ItemTemplate 的情况下,效果如下图所示: 其当前选中的项(红框内)与自定义的 ItemTemplate 一样: 但 ...

  9. [Winform] DataGridView 中 DataGridViewComboBox 的可编辑

    在 DataGridView 中设置的 DataGridViewComboBox,默认是不可编辑的,即使将其列属性 DisplayStyle 设置成 ComboBox 或其他,也无法编辑: 故作如下处 ...

随机推荐

  1. WEBUS2.0 In Action - 搜索操作指南 - (1)

    上一篇:WEBUS2.0 In Action - 索引操作指南(2) | 下一篇:WEBUS2.0 In Action - 搜索操作指南(2) 1. IQueriable中内置的搜索功能 在Webus ...

  2. centos 6.5 minimal 安装及vm-tools安装

    安装vm-->注册vm-->新建一个虚拟机(选择等会安装系统)-->加载iso-->配置桥接-->启动 这里可能碰到一个cpu的虚拟化配置,需要在bios里的配置设置为e ...

  3. android 语言切换过程分析

    android 语言切换过程分析 2014-02-27 18:13 1207人阅读 评论(0) 收藏 举报 语言切换android语言切换android改变语言 最近在看一个bug,系统切换语言后,本 ...

  4. Android 高仿微信 获取最近刚刚拍照的缩略图 功能实现

    原理其实挺简单的,android 中文件 修改 增加 删除等等 都会在数据库里的某个表里记录下来,你需要的时候 只要迅速的去查找这个表里的值 即可得到你想要的所有信息. 实际上 如果真正理解这个表结构 ...

  5. unity, setting standard shader by script

    http://forum.unity3d.com/threads/change-standard-shader-render-mode-in-runtime.318815/

  6. Delphi 异或,英文为exclusive OR,或缩写成xor

    异或,英文为exclusive OR,或缩写成xor 异或(xor)是一个数学运算符.它应用于逻辑运算.异或的数学符号为“⊕”,计算机符号为“xor”.其运算法则为: a⊕b = (¬a ∧ b) ∨ ...

  7. testng之listener

    这周在给人培训selenium+testng框架时,讲到listener这块发现对listener并没有完全了解,于是自己又重新学习了下. 以下是 TestNG 提供的几种监听器: IAnnotati ...

  8. Python函数练习:冒泡算法+快速排序(二分法)

    冒泡算法: #-*- coding: UTF-8 -*-#冒泡排序 def func(lt):if type(lt).__name__ !='list' and type(lt).__name__ ! ...

  9. Python 中的 is 和 id

    (ob1 is ob2) 等价于 (id(ob1) == id(ob2)) 首先id函数可以获得对象的内存地址,如果两个对象的内存地址是一样的,那么这两个对象肯定是一个对象.和is是等价的.Pytho ...

  10. c/c++ 数字转成字符串, 字符串转成数字

    c/c++ 数字转成字符串, 字符串转成数字 ------转帖 数字转字符串: 用C++的streanstream: #include <sstream> #Include <str ...