AcceptEx
平台SDK:Windows套接字
AcceptEx
Windows套接字AcceptEx函数接受一个新的连接,返回本地和远程地址,并接收由客户端应用程序发送的第一块数据。Windows 95/98不支持AcceptEx函数。
注意:此函数是一个Microsoft特定的扩展,Windows Sockets规范。有关详细信息,请参阅Microsoft扩展和Windows Sockets 2。
BOOL AcceptEx(
SOCKET sListenSocket,
SOCKET sAcceptSocket,
PVOID lpOutputBuffer,
DWORD dwReceiveDataLength,
DWORD dwLocalAddressLength,
DWORD dwRemoteAddressLength,
LPDWORD lpdwBytesReceived,
LPOVERLAPPED lpOverlapped
);
参数
sListenSocket
[在]侦听套接字。服务器应用程序在这个套接字上等待连接。
sAcceptSocket
[在]被接受的连接相关联的套接字。
lpOutputBuffer
[在]指向一个缓冲区,它接收了一个新的连接发送数据的第一个块,该服务器的本地地址,客户端的远程地址。接收数据写入到的偏移量0开始的第一部分的缓冲区,而地址写入缓冲区的后半部。如果此参数设置为NULL,将不会得到执行,也不会在本地或远程的地址是通过GetAcceptExSockaddrs函数调用使用。
dwReceiveDataLength
[在]在lpOutputBuffer字节数,将用于实际收到的数据缓冲区的开始。这一大小应不包括服务器的本地地址的大小或客户端的远程地址,他们被追加到输出缓冲区。如果dwReceiveDataLength是零,接受该连接将不会导致接收操作。相反,AcceptEx尽快完成连接到达,没有任何等待数据。
dwLocalAddressLength
[在]为本地地址信息保留的字节数。此值必须至少有16个字节比所使用的传输协议的最大地址长度多。
dwRemoteAddressLength
[在]为远程地址的信息保留的字节数。此值必须至少有16个字节比所使用的传输协议的最大地址长度多。
lpdwBytesReceived
[out]指向一个DWORD接收的字节数接收。此参数只有在设置操作完成同步。如果它返回ERROR_IO_PENDING和完成后,那么这个DWORD是从来没有,你必须获得从完成通知机制读取的字节数。
lpOverlapped
[在]一个OVERLAPPED结构,用于处理请求。此参数必须指定,它不能为空。
返回值
如果没有错误发生,AcceptEx函数成功完成和真正的返回值。
如果函数失败,AcceptEx返回FALSE。该WSAGetLastError函数可以调用返回扩展的错误信息。如果WSAGetLastError返回ERROR_IO_PENDING,那么这次行动成功启动并仍在进行中。
备注
在AcceptEx功能结合到一个单一的API中的几个socket函数/内核过渡。在AcceptEx函数,当成功的,执行三项任务:
一个新的连接被接受。
既为连接的本地和远程地址返回。
由远程发送数据的第一个块的欢迎。
一个程序可以连接到一个套接字更快地使用AcceptEx,而不是接受的功能。
一个单一的输出缓冲区接收数据:本地套接字地址(服务器)和远程套接字地址(客户端)。
使用单一的缓冲区可以提高性能,但GetAcceptExSockaddrs必须调用函数解析到它的三个不同部分的缓冲区。
为本地和远程地址缓冲区的大小必须是16个字节比为使用传输协议地址是因为在内部格式写入sockaddr结构规模庞大。例如,一个SOCKADDR_IN大小(地址结构的TCP / IP协议)是16个字节。因此,至少32个字节的缓冲区的大小必须被指定为本地和远程地址。
AcceptEx函数使用的重叠与Windows套接字1.1的I / O,接受功能。如果应用程序使用AcceptEx,它可以与服务的线程数量相对较少的不少客户。如同所有的Win32函数重叠,无论是Win32事件或完成端口可以被用来作为完成通知机制。
AcceptEx之间的另一个功能和Windows套接字1.1的主要区别是,接受功能的AcceptEx函数需要调用者已经有两个套接字:
一个指定的套接字听。
一个指定的套接字接受连接。
该sAcceptSocket参数必须是一个开放的插座,既不是约束,也不连接。
该GetQueuedCompletionStatus函数或GetOverlappedResult函数lpNumberOfBytesTransferred参数表明在请求接收的字节数。
当此操作成功完成,sAcceptHandle可以通过,但对下列功能只:
ReadFile
WriteFile
发送
recv
TransmitFile
关闭套接字
注意:如果您有一个名为同时与TF_DISCONNECT和TF_REUSE_SOCKET标志,指定套接字的TransmitFile函数已经回到了其中的约束,也不是没有连接的状态。然后,您可以通过套接字句柄在sAcceptSocket参数的AcceptEx函数。
当AcceptEx函数返回时,套接字sAcceptSocket是一个连接套接字在默认状态。该插座sAcceptSocket不是继承与sListenSocket参数相关的套接字,直到SO_UPDATE_ACCEPT_CONTEXT是套接字上设置的属性。使用Setsockopt函数来设置SO_UPDATE_ACCEPT_CONTEXT选项,指定sAcceptSocket的套接字句柄和sListenSocket作为选项的值。
例如:
error= setsockopt(sAcceptSocket,
SOL_SOCKET,
SO_UPDATE_ACCEPT_CONTEXT,
(char*)&sListenSocket,
sizeof(sListenSocket));
使用与SO_CONNECT_TIME选项来检查是否连接已接受了getsockopt功能。如果它已被接受,您可以判断多久连接已建立。返回值是秒数套接字已连接。如果套接字未连接,getsockopt返回0xFFFFFFFF的。这样的检查是必要的联系,看看是否连接已建立了一段时间没有收到任何数据。我们建议您终止这些连接。
例如:
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);
)
注释的ATM
没有与连接设置相关的重要问题时,使用Windows套接字2异步传输模式(ATM)。请参阅Windows套接字2备注部分承担重要的ATM连接设置信息函数文档。
需求
系统版本:要求Windows套接字1.1或更高版本。微软专用的扩展。
头文件:#include Mswsock.h。
导入库:Mswsock.lib。
建于2009年5月12日,2000Requirements
版本:要求Windows套接字1.1或更高版本。微软专用的扩展。