请问IOCP中如何主动关闭客户端连接?
本人目前在开发网络服务器端程序,服务器端用的是IOCP架构。
在网上也浏览过不少例子,但是发现其中不少都是等待客户端关闭连接,然后服务器端才释放资源。
现在我想在WSASend之后,自动断开客户端连接,并释放相关资源。请问如何操作?
我的程序结构如下:
//工作线程
DWORD WINAPI ServerWorkerThread(void* completionPortID)
{
HANDLE completionPort = (HANDLE)completionPortID;
DWORD bytesTransferred;
LPPER_HANDLE_DATA perHandleData;
LPPER_IO_OPERATION_DATA perIoData;
CString* str_RCV;
while(true)
{
if(GetQueuedCompletionStatus(completionPort,&bytesTransferred,
(LPDWORD)&perHandleData,(LPOVERLAPPED*)&perIoData,INFINITE) == 0)
{
if((GetLastError() == WAIT_TIMEOUT) || (GetLastError() == ERROR_NETNAME_DELETED))//客户端没有正常退出
{
closesocket(perHandleData->socket);
GlobalFree(perHandleData);
GlobalFree(perIoData);
continue;
}
else
{
return 0;
}
}
if(bytesTransferred == 0)//响应客户端主动断开
{
closesocket(perHandleData->socket);
GlobalFree(perHandleData);
GlobalFree(perIoData);
continue;
}
switch (perIoData->OpCode)
{
case OP_ACCEPT:
break;
case OP_WRITE://写完成(发)
{
// 为下一个重叠调用建立单I/O操作数据
memset(&perIoData->Overlapped,0,sizeof(OVERLAPPED));
perIoData->dataBuf.len = DATA_BUFSIZE;
perIoData->dataBuf.buf = perIoData->buffer;
perIoData->OpCode = OP_READ; //读操作
DWORD recvBytes;
DWORD flags = 0;
WSARecv(perHandleData->Socket,&(perIoData->dataBuf),1,
&recvBytes,&flags,&(perIoData->Overlapped),NULL);
break;
}
case OP_READ://读完成(收)
{
*str_RCV =perIoData->buffer;
::SendMessage(this_hWnd,USR_MAIN,0,(LPARAM)str);
//为下一个重叠调用建立操作数据
memset(&perIoData->Overlapped,0,sizeof(OVERLAPPED));
perIoData->dataBuf.buf = AAAAAA.GetBuffer();
perIoData->dataBuf.len = AAAAAA.GetLength();
////////////////////////////////////////////////////////
perIoData->OpCode = OP_WRITE;
DWORD bytesSend;
DWORD flags = 0;
int i=WSASend(perHandleData->Socket,&(perIoData->dataBuf),1,&bytesSend,
0,&(perIoData->Overlapped),0);
//////////////////////////////我想在这里断开连接并释放资源,但是始终不行
/*
memset(&perIoData->Overlapped,0,sizeof(OVERLAPPED));
memset(&perIoData->buffer,0,sizeof(perIoData->buffer));
closesocket(perHandleData->Socket);
GlobalFree(perHandleData);
GlobalFree(perIoData);
*/
}
break;
}
}
}
}