高手帮忙看看这种情况:CAsyncSocket限制连接数

peakarwen 2006-04-12 04:27:26
网上很多资料说在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监听?我不想这么做。

不知哪位高手能提供个较好的解决方案,毕竟这是一个很常见的问题。(此处不考虑多线程情况)
...全文
268 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
truemann 2006-04-19
  • 打赏
  • 举报
回复
"在还没有调用OnAccept时,tcp连接就已经建立了,对端就可以发送数据了?"
我跟踪调试了,确实是成功的发数据了,只是服务器端没有收到而已。
...这里的发送只是到系统缓冲了,不见得是已经通过网络发送成功了;
另外限制用户连接可以参考WSAAccept
truemann 2006-04-14
  • 打赏
  • 举报
回复
tcp的握手,建立连接,是在listen sockt完成的.
连接简历就可以发送数据了,但是这时的数据,是通过socket发送的,事实并不一定发送了出去,只是在系统缓存;
socket是tcp之上的包装
peakarwen 2006-04-13
  • 打赏
  • 举报
回复
"在还没有调用OnAccept时,tcp连接就已经建立了,对端就可以发送数据了?"
我跟踪调试了,确实是成功的发数据了,只是服务器端没有收到而已。
truemann 2006-04-12
  • 打赏
  • 举报
回复
一个提醒:
区分一下socket和tcp;
在还没有调用OnAccept时,tcp连接就已经建立了,对端就可以发送数据了?
peakarwen 2006-04-12
  • 打赏
  • 举报
回复
用netstat -a命令发现,socket3确实连接上了established,但Listening Socket并没有Accept啊,有没有谁知道为什么?socket3发出的数据给谁了? 另:既然连上了,又为什么能发送数据而接收不到数据?
peakarwen 2006-04-12
  • 打赏
  • 举报
回复
“初步怀疑是发给了Listening Socket,不知大家怎么看?”

现在已经排除Socket3发送给Listening Socket的情况

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧