【发布时间】:2013-11-13 14:23:02
【问题描述】:
我目前正在尝试一些用于套接字编程的新库 (IOCP)。我偶然发现了AcceptEx 启用异步连接的功能。
正如文档所说:
AcceptEx 函数使用重叠 I/O,与 accept 函数不同。如果您的应用程序使用 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 绑定到完成端口
【问题讨论】:
-
非零 dwReceiveDataLength,所以 MSDN '如果 dwReceiveDataLength 为零,接受连接不会导致接收操作。相反,只要连接到达,AcceptEx 就会完成,无需等待任何数据。不适用。此外,这段代码看起来不太像 C++。
-
outBufLen - ((sizeof (sockaddr_in) + 16) * 2) 在我的情况下是 960,所以这不是问题..
-
这不是问题:)