收录日期:2018/11/19 05:26:37 时间: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

怎样做出窗体中的状态栏?? ==TQuery能定义文件名的变参吗?==== hhxz770 (风灵)-- Notes 金盆洗手,散分。--各位仍在notes第一线的兄弟姐妹们 TJPEGImage 定义的指针加了图象好,怎么来释放图象。? hhxz770 (风灵)-- Notes 金盆洗手,散分。--各位仍在notes第一线的兄弟姐妹们 请意者出价 删除表的问题??? winxp里如何设置package的路径? 坏了,全坏了,我的oracle什么都不能用了! hhxz770 (风灵)-- Notes 金盆洗手,散分。--各位仍在notes第一线的兄弟姐妹们 hhxz770 (风灵)-- Notes 金盆洗手,散分。--各位仍在notes第一线的兄弟姐妹们 hhxz770 (风灵)-- Notes 金盆洗手,散分。--各位仍在notes第一线的兄弟姐妹们 hhxz770 (风灵)-- Notes 金盆洗手,散分。--各位仍在notes第一线的兄弟姐妹们 各位大哥,帮忙看看 hhxz770 (风灵)-- Notes 金盆洗手,散分。--各位仍在notes第一线的兄弟姐妹们 这样的ASP怎么写[内详](一堆问题之二) 网络调查:你最常去的五大网站? 为何LINUX这么慢... 请问有没有人看过<<如何理解c和c ++的复杂类型声明>>这篇文章 如何从16bits的位图得到灰度,并且显示? 高分!!! 请问有没有人看过<<如何理解c和c ++的复杂类型声明>>这篇文章 请问谁知道C#怎么读啊? 有关在textbox中使用方向键的问题? 为什么编译错误? vb中用什么命令读取ini文件? BCB中按F11出現的那個屬性編輯器,如何在程序中應用? datareader对象,如何对一个字段进行处理,再databind()呢,谢谢. 请问在存储过程中如何得到表中上一记录的值? 用java寫一個上网密碼的驗証程式