收录日期:2019/01/17 21:35:54 时间: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

问题:谁有jbuilder6.0的书?电子的也行。给你加100分!注意是6.0而不是其他版本的。 如何用PB做DLL文件 江湖救急,如何在delphi中调用微软的dso组件做数据挖掘 求助:火车条形码的解码哪位大侠能提拱啊? 如何组建一个三层结构 在数据库中,如何得到当前记录指针所在位置,并如何转换成数字型. 求助:火车条形码的解码哪位大侠能提拱啊? 帮我看看什么问题吧,在BC++3.1中编译错误,但vc下没错啊,gcc下也没错 softsprite,softsprite,softsprite,softsprite 奇怪! 我想用一个RichEdit或Memo控件模拟一个控制台程序在Cmd窗口显示的结果,可以做到吗?[在线等待回复] 关于JSP的indexOf()问题 呼唤高手前来相助,苦! 请教小问题 关于软件中断 我设计的包,有关Exception的抛出,处理和分派,希望大家能给我建设性的提示和意见 当是以“出生年月”查询时代码应该怎么写?请帮助,谢谢。 小菜鸟的问题 如何用delphi写一个定时关机的程序 有谁知道 shelltreeview1.Selected.Text,如何判断得到的是节点还是文件名? 各位大虾有礼了,请问mfc调用dll是怎么回事? \"0X408\"是十进制的多少啊? 紧急求助,紧急求助,紧急求助,紧急求助, 有關RowID的問題(10分) vb6工程升级 WINDOWS API:怎样获得网络中另一台计算机的时间! 各位大哥,我总共才30分了,请帮帮我,关于文件的大小判断和删除. form中怎么做到在一个block中(tabular)头一行总是空的 请问:工具栏上的下拉框怎么加上呀?谢谢 函数声明和定义的问题