Windows
套接字AcceptEx函数接受一个新的连接,返回本地和远程地址,并接收由客户端应用程序发送的第一块数据。Windows 95/98不支持AcceptEx函数。
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
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. 返回连接的本地和远程地址。
*较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。
当此操作成功完成,sAcceptSocket可以使用,但只限下列功能:
ReadFile
WriteFile
发送
recv
关闭套接字
当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连接设置
信息函数文档。
- ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑
前言: 为了赶进度,周末也写文了! 前几篇讲完查询框和工具栏,这节讲表格数据相关的操作. 先看一下列表: 接下来我们有很多事情可以做. 1:格式化 - 键值的翻译 对于“启用”列,已经配置了格式化 # ...
- java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis
A 调用摄像头拍照,自定义裁剪编辑头像 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单; 技术:313596790freemaker模版技术 ,0个代码不用写 ...
- 好用的Markdown编辑器一览 readme.md 编辑查看
https://github.com/pandao/editor.md https://pandao.github.io/editor.md/examples/index.html Editor.md ...
- Linux 中优秀的文本化编辑思想大碰撞(Markdown、LaTeX、MathJax)
这样一个标题可能不太准确,因为确实无法准确地解释什么叫"文本化编辑思想".其实我这篇随笔主要是想探讨 Markdown.LaTeX.MathJax,有兴趣的朋友可以继续往下看,同时 ...
- php后台编辑关联数据
数据库中两张表: info表中"民族"关联了nation表中的"code". php通过后台编辑info表中民族显示成用户可看懂及可直接修改的选项. 新建xin ...
- iOS 编辑UITableView(根据iOS编程编写)
上个项目我们完成了 JXHomepwner 简单的应用展示,项目地址.本节我们需要在上节项目基础上,增加一些响应用户操作.包括添加,删除和移动表格. 编辑模式 UITableView 有一个名为 e ...
- C# 视频编辑
VidCoder VidCoder是一个开源免费的DVD/蓝光视频抓取和转码软件.使用HandBrake做为编码引擎.比Handbrake拥有更友好的用户界面. 可裁剪.剪切.字幕编辑.转码等. 官网 ...
- [C1] C1ComboBox 的非编辑状态优化
一.前言 先看看 WPF 自带的 ComboBox 在非编辑状态,自定义 ItemTemplate 的情况下,效果如下图所示: 其当前选中的项(红框内)与自定义的 ItemTemplate 一样: 但 ...
- [Winform] DataGridView 中 DataGridViewComboBox 的可编辑
在 DataGridView 中设置的 DataGridViewComboBox,默认是不可编辑的,即使将其列属性 DisplayStyle 设置成 ComboBox 或其他,也无法编辑: 故作如下处 ...
随机推荐
- ab做压力测试
ab是apache 自带的一个压力测试的小工具,可用于接口简单的压力测试. 以下是AB的简要介绍 格式:ab [options] [http://]hostname[:port]/path 参数说明: ...
- 旧书重温:0day2【2】 实验:三种获取kernel32.dll基址的方法
0x01 找kernel32基地址的方法一般有三种: 暴力搜索法.异常处理链表搜索法.PEB法. 0x02 基本原理 暴力搜索法是最早的动态查找kernel32基地址的方法.它的原理是几乎所有的win ...
- 学习macos常用的一些快捷键笔记
学习mac 操作系统使用笔记 Dock功能学习 类似快捷图标一样 Command+q quit a program Dock上添加与删除都用拖动 command+delete 删除文件 shift+c ...
- PPTP模式跟L2TP模式有什么不同
使用VPN的时候经常会看到商家说支持PPTP模式和L2TP模式,但是许多朋友都不知道有什么区别,该用哪一个,下面给你们讲讲: 1).PPTP协议是点对点隧道协议:其将控制包与数据包分开,控制包采用TC ...
- pg psql命令
linux下使用psql命令操作数据库 下面主要用到了insert into ,pg_dump , pg_restore 命令 按步骤走 su postgres ...
- 【转】IOS 开发环境,证书和授权文件等详解
(转自:http://blog.csdn.net/gtncwy/article/details/8617788) 一.成员介绍1. Certification(证书)证书是对电脑开发资格的认证, ...
- CURL: CURLE_COULDNT_CONNECT问题探究
摘自:: 存储系统研究: socket connect error 99(Cannot assign request address) 这是最近使用libcurl写http服务的压力测试的时候遇到的 ...
- C#中的枚举类型(enum type)
ylbtech 原文 C#中的枚举类型(enum type) 概念 枚举类型(enum type)是具有一组命名常量的独特的值类型.在以下示例中: enum Color { Red, Green, B ...
- LruCache--远程图片获取与本地缓存
Class Overview A cache that holds strong references to a limited number of values. Each time a value ...
- Jersey搭建Restful服务器 on Ubuntu
自己试着在Ubuntu上搭建一个 1.首先安装eclipse和tomcat sudo apt-get install eclipse tomcat7 -y 2.把tomcat的group assign ...