1、AcceptEx()
AcceptEx()用于异步接收连接,可以取得客户程序发送的第一块数据。
- 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
- );
AcceptEx()成功完成后执行了三个操作:1、接受了新的连接;2、新连接的本地地址和远程地址都会返回;3、接收到了远程主机发来的第一块数据。
如果没有错误发生,AcceptEx函数成功完成并返回TRUE。
如果函数失败,AcceptEx返回FALSE。可以调用WSAGetLastError函数获得扩展的错误信息,如果WSAGetLastError返回ERROR_IO_PENDING,那么这次行动成功启动并仍在进行中。
如果提供了数据接收缓冲区(dwReceiveDataLength不为0),AcceptEx()投递的重叠操作直到接受到连接并且读到数据之后才会完成。可以使用getsockopt的SO_CONNECT_TIME选项来检查一个连接是否已经接受,如果它已被接受,你可以获得连接已经建立了多长时间(秒数),如果套接字未连接,getsockopt返回0xFFFFFFFF。应用程序通过检查重叠操作是否完成,并组合SO_CONNECT_TIME选项可以确定是否连接已建立了一段时间但没有收到任何数据,我们建议您通过关闭连接来终止这些连接,从而使AcceptEx()完成操作并返回一个错误状态。例如:
int seconds;
int bytes = sizeof(seconds);
int iResult = 0;
iResult = getsockopt(s, SOL_SOCKET, SO_CONNECT_TIME, (char *)&seconds, (PINT)&bytes);
if (iResult != NO_ERROR)
{
printf("getsockopt(SO_CONNECT_TIME) failed with error: %u\n", WSAGetLastError());
}
else
{
if (seconds == 0xFFFFFFFF)
printf("Connection not established yet\n");
else
printf("Connection has been established %ld seconds\n", seconds);
}
较accept函数而言,程序使用AcceptEx可以更快连接到一个套接字。
AcceptEx()是一个M