我目前正在尝试一些用于套接字编程的新库(IOCP)。我偶然发现了AcceptEx http://msdn.microsoft.com/en-us/library/windows/desktop/ms737524%28v=vs.85%29.aspx启用异步连接的功能。
正如文档所说:
与accept函数不同,AcceptEx函数使用重叠I/O。如果您的应用程序使用 AcceptEx,它可以使用相对较少的线程为大量客户端提供服务。与所有重叠的 Windows 函数一样,Windows 事件或完成端口都可以用作完成通知机制。
但是当客户端连接时我没有收到任何完成信息。然而,当客户端发送数据时,我确实完成了。
这是我的代码:
DWORD dwBytes;
GUID GuidAcceptEx = WSAID_ACCEPTEX;
int iResult = WSAIoctl(m_hSocket, SIO_GET_EXTENSION_FUNCTION_POINTER,
&GuidAcceptEx, sizeof (GuidAcceptEx),
&m_lpfnAcceptEx, sizeof (m_lpfnAcceptEx),
&dwBytes, NULL, NULL);
if (iResult == SOCKET_ERROR)
{
CloseSocket();
}
进而:
WSAOVERLAPPED olOverlap;
memset(&olOverlap, 0, sizeof (olOverlap));
char lpOutputBuf[1024];
int outBufLen = 1024;
DWORD dwBytes;
BOOL bRet = m_lpfnAcceptEx( m_hSocket, hSocket, lpOutputBuf,
outBufLen - ((sizeof (sockaddr_in) + 16) * 2),
sizeof (sockaddr_in) + 16, sizeof (sockaddr_in) + 16,
&dwBytes, &olOverlap);
if ( bRet == FALSE )
{
DWORD dwRet = WSAGetLastError();
if( dwRet != WSA_IO_PENDING )
{
return dwRet;
}
}
关于如何接收完成的任何建议?
编辑:
我在 m_lpfnAcceptEx() 之后将 hSocket 绑定到完成端口