收录日期:2019/03/21 00:16:14 时间:2016/06/06 22:13:41 标签:网络编程
网上很多资料说在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监听?我不想这么做。

不知哪位高手能提供个较好的解决方案,毕竟这是一个很常见的问题。(此处不考虑多线程情况)
“初步怀疑是发给了Listening Socket,不知大家怎么看?”

现在已经排除Socket3发送给Listening Socket的情况
用netstat -a命令发现,socket3确实连接上了established,但Listening Socket并没有Accept啊,有没有谁知道为什么?socket3发出的数据给谁了?  另:既然连上了,又为什么能发送数据而接收不到数据?
一个提醒:
区分一下socket和tcp;
在还没有调用OnAccept时,tcp连接就已经建立了,对端就可以发送数据了?
"在还没有调用OnAccept时,tcp连接就已经建立了,对端就可以发送数据了?"
我跟踪调试了,确实是成功的发数据了,只是服务器端没有收到而已。
tcp的握手,建立连接,是在listen sockt完成的.
连接简历就可以发送数据了,但是这时的数据,是通过socket发送的,事实并不一定发送了出去,只是在系统缓存;
socket是tcp之上的包装
"在还没有调用OnAccept时,tcp连接就已经建立了,对端就可以发送数据了?"
我跟踪调试了,确实是成功的发数据了,只是服务器端没有收到而已。
...这里的发送只是到系统缓冲了,不见得是已经通过网络发送成功了;
另外限制用户连接可以参考WSAAccept

每次运行页面时,此页面都自动刷新一次的代码怎么写? 怎样得到文件考备时的进度? 有没有人写过这样一个功能,本人急用,谢谢大侠了 datagrid控件的顽固问题 MSN的语音聊天是哪个端口?(我用防火墙把端口都封掉后,语音不能用了。不知要开启哪个端口) 寻找一个稳定的GIF控件或类 一个很菜的问题,那位大虾给讲一下,今天晚上揭贴! 请问,如何关掉Windows NT / 2000 SMB? WinSNMP如何接收消息? 急!!!!!!!! ASP。NET如何生成象CSDN论坛这样的三栏界面,上面一栏,左边一栏,右一栏,点左边右面的刷新 win2000下的进程隐藏!急!可送多次! Java反编译问题~~~盼高手指点 很多行,每行后面都有一个文本框和按钮,要求点击按钮转到处理页面,怎么得到按下的那个按钮前面文本框的值? 為什麼 Exchange Server 5.5 有16G 的郵箱限制 有谁知道刘德华的黑蝙蝠中队的英文版叫什么名字? 熟悉WinSNMP API的请进! WinSNMP如何接收消息? 请问能否给excel添加自定义的菜单? 一个困扰我很久的问题 ,我至今都还是很糊涂!!!! 窗体属性设置问题 熟悉WinSNMP API的请进! WinSNMP如何接收消息? form提交问题 哎,今天25岁了,散分! 各位请教一下,关于软驱的问题, 水晶报表9.0加入Datasource时的问题! 简单问题 JSP调用EJB出错 如何从一字符串中取出特定位置的几个连续字符? ofstream输出文件的格式问题?(C++) 我把我的Win2000 professional IIS5.0+Tomcat5.0+j2sdk1.4.2的配置经历和大家分享,同时请教一下高手TomcatFAQ上写的配置怎么这么麻烦