高手帮忙看看这种情况:CAsyncSocket限制连接数
网上很多资料说在Listen(int nBackLog)中指定,但经实验并不是,这只是限制并发请求连接的数量。
我采用的方法是在FD_ACCEPT事件中判断当前连接数是否达到规定值,是的话返回:
void CServerSocket::OnAccept(int nErrorCode)
{
if(nErrorCode==0)
{
if( (UINT)this->m_mapOfClients.GetCount() >= this->m_nMaxClients )
{
Alert("Full!");
return;
}
CClientSocket *pClient = new CClientSocket();
if(this->Accept(*pClient))
{
if(pClient->Configure(this))
{
if(this->AddClient(pClient))
{
return; //成功则返回
}
}
}
//若出错,则删除
if(pClient->m_hSocket!=INVALID_SOCKET)
{
pClient->ShutDown(2);
}
pClient->Close();
delete pClient;
}
}
我把m_nMaxClients设置为2时并且Listen(int nBackLog)中的nBackLog指定为1,前两个连接的Socket正常进行通讯,第三个连接的Socket3可以连接和发送数据但接收不了数据,第四个及以后就连接不上了。可见,nBackLog确实指定了待连接队列长度,修改此值发生相应的情况,证明了它的作用是指定代连接队列长度而不是连接数,网上有很多资料误人子弟了。
但是,现在我不明白,为什么第三个Socket3还可以连接上而且可以成功的向服务器发送数据呢?(服务端无法向这个Socket3发送返回消息,因为上面代码中没有调用Accept给它一个处理Socket,可既然这样,为什么Socket3还能成功的往服务器发送数据?)初步怀疑是发给了Listening Socket,不知大家怎么看?
如果我想限制连接数为2时不让Socket3能连接上服务器并发送数据,该怎么做呢? 网上有的资料说可以Accept它,然后关闭对他的连接,可这样的话如果还有Socket4、Socket5...在连接,那我岂不是每个都要Accept并关闭,那岂不是让费资源? 也有人说关闭监听,怎么关?然道要把Listening Socket关闭掉?等连接数小于允许连接数时再开个Listening Socket监听?我不想这么做。
不知哪位高手能提供个较好的解决方案,毕竟这是一个很常见的问题。(此处不考虑多线程情况)