IOCP主动断开客户连接 为了减轻服务器的压力小弟设想,在给客户发送消息之后,就主动断开这个连接发现用closesocket却断不开请大家帮帮忙~谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Try shutdown(s, SD_SEND),and then closesocket(s). 断不开?是调用closesocket出错?还是你压根儿就没有处理,还是客户端会主动重连?我所有的连接都是主动断开的,特别是采有长时间无数据即断开的策略,三秒钟不发数据就认为它断开,然后就是closesocket。一万个连接也只要几秒钟(列表同步产生线程操作临界区碰撞消耗时间)。 最近没事,跟在unsigned后面学习几天 to unsigned:1、closesocket是断不开的,网上也有相关文章,我尝试了下,正如文章所说2、客户端不会主动重连,因为,测试用的客户端,是我为了方便测试而写的3、请告诉我你的处理方法?谢谢 1.断开可以用netstat看看状态是什么,只听说过一种情况,当使用acceptex时,没有调用SO_UPDATE_ACCEPT_CONTEXT,无法关闭新的socket。但是具体会出现什么状态没有做过测试。 刚才测试了一下,估计将SO_UPDATE_ACCEPT_CONTEXT去掉,照样可以正常工作,服务器端强行closesocket并没有象楼主说的无法断开。我所使用的前面说的情况,即判断一定时间内客户端无消息交互即断开,测试时使用的是telnet,但是连上之后不发任何消息,然后一小段时间之后就被服务端主动断开了。 如果是有xxx_wait状态,那么就不应该是iocp主动断开的问题。 1、我没有用acceptex,应该就不会有SO_UPDATE_ACCEPT_CONTEXT的问题吧2、在服务端使用closesocket后,用服务端自己的查看当前连接客户端的功能,还是可以看到此客户端连接,如果客户端里面主动断开就不会出现这种情况 在服务端使用closesocket后,用服务端自己的查看当前连接客户端的功能,还是可以看到此客户端连接,如果客户端里面主动断开就不会出现这种情况==========================这个没有断开,很有可能只是你的服务处理逻辑上面的问题。建议使用netstat -na -o查看相关连接内容,如果netstat 看不到相关的连接信息,那就可以完完全全确定是服务器处理逻辑上面的问题。建议,如果代码量不大的话,可以把 GetQueuedCompletedStats那一段线程代码(包括如何处理断开,这个比较关键)发上来让大伙帮你分析一下问题。 netstat -na -o查看服务器状态是FIN_WAIT_2客户端状态是CLOSE_WAIT这样算是正常么? 不正常,昨天我们就有一台服务器出现类似的问题。如果方便的话,可以把两端的代码发到我邮箱,我们正想重现类似的问题,谢谢。[[email protected]]僵哥[/email] 昏倒,邮件地址打错了[[email protected]]僵哥[/email]。 断开连接的时候: active close一方:发送 FIN M后进入 FIN_WAIT_1 状态,收到ACK M+1后进入FIN_WAIT_2状态,再收到FIN N后,发送ACK N+1,进入TIME_WAIT 状态(马上详细讲这个TIME_WAIT)。 passive close一方:收到FIN M,发送ACK M+1,进入CLOSE_WAIT状态,当应用程序调用了close后,发送FIN N,进入LAST_ACK状态,收到最后一个ACKN+1后,回到CLOSED状态。 不好意思,服务器已经应用于商业今天番看代码的时候,觉得加上主动断开比较好已经找到原因了,谢谢大家关闭的时候设置下这个就可以了,至少在我这是这样的,仅供大家参考lingerStruct.l_onoff = 1;lingerStruct.l_linger = 0;setsockopt( pContext->m_Socket, SOL_SOCKET, SO_LINGER, (char *)&lingerStruct, sizeof(lingerStruct) ); 关闭的状态信息,大部分都知道,关键点在于程序代码当中的实现。我们客户那里出现问题的程序,一方是我们的应用程序(相当于客户端),另一端是第三方的程序。到最后的结果,正好跟楼主的状况反一方向,也就是客户端是FIN_WAIT_2,而第三方的服务器是CLOSE_WAIT,我们也怀疑是第三方的程序存在问题,即当我们调用shutdown之后,对端收到可读(数据长度为0,即关闭信号),没有调用closesocket)。但是仅那一家客户,仅昨天出现过。 求解,来者有分。 如何从数据库逐条读取记录 怎么使用detour 才能HOOK到c++builder调用的函数 MFC中如何序列化结构体? 基于dialog工程,如何使用dll里的资源? 重载WebBrowser的 HTMLDocumentEvents2::onclick Event事件时怎么实现返回默认 工具栏与位图对不上号 招聘信息 关于多线程 一个小问题:如何获得本机ip地址和用户名等信息? VC开发的软件如何有效防止他人随意拷贝使用? VC2005的初级问题
2、客户端不会主动重连,因为,测试用的客户端,是我为了方便测试而写的
3、请告诉我你的处理方法?谢谢
2、在服务端使用closesocket后,用服务端自己的查看当前连接客户端的功能,还是可以看到此客户端连接,如果客户端里面主动断开就不会出现这种情况
==========================
这个没有断开,很有可能只是你的服务处理逻辑上面的问题。建议使用netstat -na -o查看相关连接内容,如果netstat 看不到相关的连接信息,那就可以完完全全确定是服务器处理逻辑上面的问题。建议,如果代码量不大的话,可以把 GetQueuedCompletedStats那一段线程代码(包括如何处理断开,这个比较关键)发上来让大伙帮你分析一下问题。
服务器状态是FIN_WAIT_2
客户端状态是CLOSE_WAIT这样算是正常么?
进入FIN_WAIT_2状态,再收到FIN N后,发送ACK N+1,进入TIME_WAIT 状态(马
上详细讲这个TIME_WAIT)。 passive close一方:收到FIN M,发送ACK M+1,进入CLOSE_WAIT状态,当
应用程序调用了close后,发送FIN N,进入LAST_ACK状态,收到最后一个ACK
N+1后,回到CLOSED状态。
今天番看代码的时候,觉得加上主动断开比较好
已经找到原因了,谢谢大家
关闭的时候设置下这个就可以了,至少在我这是这样的,仅供大家参考lingerStruct.l_onoff = 1;
lingerStruct.l_linger = 0;
setsockopt( pContext->m_Socket, SOL_SOCKET, SO_LINGER, (char *)&lingerStruct, sizeof(lingerStruct) );