对IOCP模型中获取客户端状态的思考

本文介绍IOCP模型在Windows环境下实现网络通信的方式,并通过一个示例代码展示了如何使用定时器或线程来监测客户端Socket的状态,确保连接的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     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网络与通信程序设计

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值