我想使用工作线程池和IO完成端口编写服务器.服务器应该在多个客户端之间处理和转发消息."每个客户端"数据位于ClientContext类中.使用工作线程交换此类实例之间的数据.我认为这是一个典型的场景.
但是,我有两个IO完成端口的问题.
(1)第一个问题是服务器基本上从客户端接收数据,但我不知道是否收到了完整的消息.事实上,WSAGetLastError()始终返回WSARecv()仍处于挂起状态.我试图用WaitForMultipleObjects()等待事件OVERLAPPED.hEvent.但是,它永远阻止,即WSARecv()永远不会在我的程序中完成.我的目标是在进一步处理开始之前完全确定已收到整条消息.我的消息在其标题中有一个"消息长度"字段,但我真的没有看到如何将它与IOCP函数参数一起使用.
(2)如果WSARecv()在下面的代码片段中被注释掉,程序仍会接收数据.那是什么意思?这是否意味着我根本不需要调用WSARecv()?我无法通过这些IO完成端口获得确定性行为.谢谢你的帮助!
while(WaitForSingleObject(module_com->m_shutdown_event, 0)!= WAIT_OBJECT_0)
{
dequeue_result = GetQueuedCompletionStatus(module_com->m_h_io_completion_port,
&transfered_bytes,
(LPDWORD)&lp_completion_key,
&p_ol,
INFINITE);
if (lp_completion_key == NULL)
{
//Shutting down
break;
}
//Get client context
current_context = (ClientContext *)lp_completion_key;
//IOCP error
if(dequeue_result == FALSE)
{
//... do some error handling...
}
else
{
// 'per client' data
thread_state = current_context->GetState();
wsa_recv_buf = current_context->GetWSABUFPtr();
// 'per call' data
this_overlapped = current_context->GetOVERLAPPEDPtr();
}
while(thread_state != STATE_DONE)
{
switch(thread_state)
{
case STATE_INIT:
//Check if completion packet has been posted by internal …Run Code Online (Sandbox Code Playgroud)