IOCP模型是Windows操作系统下处理高并发的网络通信采取的一种策略,Boost.Asio在Windows操作系统也是采用IOCP模型。该模型利用GetQueuedCompletionStatus获取缓冲区里的数据,如果没有,那么这个Socket会等,如何定时获取客户端的Socket的状态,需要一个定时器或者一个线程来处理。
以下对<<Windows网络与通信程序设计>>中代码作了部分修改:
typedef struct _PER_HANDLE_DATA
{
SOCKET sock;
sockaddr_in addr;
int sock_status[4];//保持Socket的状态数组
int num;//相同状态的计数
int nrecord;//数组的下标
OPERATIONINFO opType;//当前的操作状态
}PER_HANDLE_DATA,*PPER_HANDLE_DATA;
以下是逻辑判断部分:
for(int id = 0;id < g_vecClient.size();id++)
{
clientData = g_vecClient.at(id);
if(clientData->opType!=OP_ACCEPT)
{
if(clientData->nrecord==0)
{
clientData->sock_status[clientData->nrecord++]=clientData->opType;
}
else
{
int nType = clientData->opType;
if(clientData->sock_status[clientData->nrecord-1]== nType)
{
clientData->num++;
if(clientData->num>2)
{
clientData->nrecord = 0;
g_vecClient.erase(find(g_vecClient.begin(),g_vecClient.end(),clientData));
closesocket(clientData->sock);
delete clientData;
}
else
{
clientData->sock_status[clientData->nrecord++]=clientData->opType;
}
}
else
{
clientData->sock_status[clientData->nrecord--]=clientData->opType;
}
}
}
else
{
clientData->num++;
if(clientData->num>2)
{
g_vecClient.erase(find(g_vecClient.begin(),g_vecClient.end(),clientData));
closesocket(clientData->sock);
delete clientData;
}
}
}
总结:
通过一个线程或者定时器不停的获取客户端的状态,主要的目的是判断客户端是否还在连接服务器。
参考:
Windows网络与通信程序设计