【发布时间】:2018-03-03 21:18:07
【问题描述】:
我在学习服务器时正在使用 IO 完成端口和 AcceptEx(),并且正在研究 Len Holgate 的免费服务器框架来做到这一点。他有以下代码:
// Basically calls AcceptEx() via a previously obtained function pointer
if (!CMSWinSock::AcceptEx(
m_listeningSocket,
pSocket->m_socket,
reinterpret_cast<void*>(const_cast<BYTE*>(pBuffer->GetBuffer())),
bufferSize,
sizeOfAddress,
sizeOfAddress,
&bytesReceived,
pBuffer))
{
const DWORD lastError = ::WSAGetLastError();
if (ERROR_IO_PENDING != lastError)
{
Output(_T("CSocketServerEx::Accept() - AcceptEx: ") + GetLastErrorMessage(lastError));
pSocket->Release();
pBuffer->Release();
}
}
else
{
// Accept completed synchronously. We need to marshal the data recieved over to the
// worker thread ourselves...
m_iocp.PostStatus((ULONG_PTR)m_listeningSocket, bytesReceived, pBuffer);
}
我对“接受同步完成”其他情况感到困惑。我已经尝试了很多次来获得这个代码路径(通过在我发出AcceptEx之前暂停代码,连接,然后恢复代码),但是每当我尝试调用总是以ERROR_IO_PENDING失败并且我得到了我的通知包。此外,我已经阅读了this MS knowledgebase article(我可能误解了)其中的说明
此外,如果 Winsock2 I/O 调用返回 SUCCESS 或 IO_PENDING,它 保证完成数据包将排队到 IOCP 时 I/O 完成
但是,我认为这不适用于AcceptEx(),因为dox 代表AcceptEx() 参数lpdwBytesReceived 的状态
仅当操作同步完成时才设置此参数。
看来它可以同步完成...有人可以告诉我如何 AcceptEx() 可以同步完成(即如何在我的服务器中复制它?)
【问题讨论】:
标签: network-programming winsock winsock2 iocp