v_bSuccess = GetQueuedCompletionStatus(
m_stchComplePort,
&v_dwNumberBytes,
(LPDWORD)&v_dwNetKey,
(LPOVERLAPPED*)&v_pOverLapped,
INFINITE
);
1、Server投递的Accept操作,AcceptEx里面的RecvDataLen参数不为0的话,表示等待客户端连接发送数据包才返回
// 如果投递成功,进入相应的操作
if(v_bSuccess && dwNumberBytes>0)
{
// 进行相应的操作
// to do....
// 重新投递一个新的accept
}
else
{
// 如果是返回失败,一般就是该Server Socket出问题了,直接断开服务端Socket连接
if(!v_bSuccess)
{
closesocket(sListenSocket);
}
else
{
// 客户端关闭了套接字,回收该句柄资源
closesocket(sCltSocket);
}
}
2、Server投递的Accept操作,AcceptEx的RecvDataLen参数为0,即接收到客户端连接立即返回
if(v_bSuccess)
{
// 进行相应的操作
// to do....
// 重新投递一个新的accept
}
else
{
// 如果是返回失败,一般就是该Server Socket出问题了,直接断开服务端Socket连接
}
3、Server投递Recv\Send返回
if(!v_bSuccess)
{
// 如果是返回失败,一般就是该Server Socket出问题了,直接断开服务端Socket连接
}
else
{
// 客户端断开连接
if(0==v_dwNumberBytes)
{
// 客户端断开连接,回收该句柄资源
closesocket(sCltSocket);
}
else
{
// 进入相应的处理
}
}
4、Client投递Recv/Send操作返回
if(!v_bSuccess)
{
// 如果是返回失败,一般就是该Server Socket出问题了,直接断开服务端Socket连接
}
else
{
// 客户端断开连接
if(0==v_dwNumberBytes)
{
// 远程服务端断开连接,回收该句柄资源
closesocket(sCltSocket);
}
else
{
// 进入相应的处理
}
}