1. 1个新的连接被接受。
2. 返回连接的本地和远程地址。
3. 得到远程发送的第1个数据块。
*较accept函数而言,程序使用AcceptEx可以更快连接到1个套接字。
*输出缓冲区lpOutputBuffer存放内容包括:接收到的第一块数据、本地套接字地址(服务器)和远程套接字地址(客户端)。
使用单一的缓冲区可以提高性能,当使用AcceptEx时,必须使用GetAcceptExSockaddrs函数将输出缓冲区的内容解析到3个不同部分的缓冲区 (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地址大十六个字节,是因为是以内部格式写入。例如,1个SOCKADDR_IN大小(TCP / IP协议的地址结构)是十六个字节。因此,本地和远程地址缓冲区的大小必须指定至少3两个字节。
*AcceptEx函数使用的重叠I / O。与使用accept相比,使用AcceptEx能以相对较少的线程数量处理大量的客户。如同所有的Win32重叠函数,Win32事件或完成端口都可用来作为完成通知机制。
AcceptEx和accept函数的另1个主要区别是,AcceptEx函数需要调用者提供2个套接字参数:
1个指定套接字。
1个指定接受连接的套接字。
该sAcceptSocket参数必须是1个已经打开的socket,不能是已绑定或者是已连接的socket。
*GetQueuedCompletionStatus函数或GetOverlappedResult函数的lpNumberOfBytesTransferred参数表明该请求接收到的字节数。
当此操作成功完成,sAcceptSocket可以使用,但只限下列功能:
ReadFile
WriteFile
发送
recv
TransmitFile
关闭套接字
注意:如果调用TransmitFile函数时,指定TF_DISCONNECT和TF_REUSE_SOCKET标志,指定套接字的已返回未绑定,未连接的状态。然后,您可以使用该套接字句柄作为AcceptEx函数的sAcceptSocket参数。但该套接字不能作为ConnectEx函数的参数。
当AcceptEx函数返回时,sAcceptSocket是1个已连接套接字。如未指定SO_UPDATE_ACCEPT_CONTEXT属性,sAcceptSocket不继承与sListenSocket参数相关套接字的属性。使用setsockopt函数来设置SO_UPDATE_ACCEPT_CONTEXT选项,指定sAcceptSocket的套接字句柄和sListenSocket作为选项的值(specifyingsAcceptSocketas the socket handle andsListenSocketas the option value) 。
例如:
error= setsockopt(sAcceptSocket,
SOL_SOCKET,
SO_UPDATE_ACCEPT_CONTEXT,
(char*)&sListenSocket,
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-21596-2.html
打得一拳开