客户端执行了closesocket(),服务端怎么知道啊,谁给实例一下
或者客户端不发心跳包,直接掉线,服务端怎么知道 问题点数:30、回复次数:12Top
1 楼dirdirdir3(风)回复于 2005-08-04 19:12:08 得分 0
closesocket()的话可以知道,服务端会收到消息在onclose里处理。直接掉线不知道,这时很容易出错。
因此建议发心跳包.Top
2 楼lianglp(寻找黄金分割点)回复于 2005-08-04 20:18:06 得分 0
用TCP建立连接的客户端,在调用closesocket时,会向服务器端发送Fin包,所有服务器端会
知道客户端要断开了,这时,服务器端TCP协议栈会通知上层的。
如果中间突然断掉,比如说需经过路由器的,这是路由器没电了等等,客户端跟服务器端是
根本不知道的。所以要防止这种情况,需要定时向一方发送相关的数据,另一方返回应答。
如果在指定的时间内没返回应答,可视为断开。Top
3 楼kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)回复于 2005-08-04 20:21:44 得分 0
还是用心跳包来检测Top
4 楼quick(我追)回复于 2005-08-04 21:30:55 得分 0
心跳包我知道了,我想知道 lianglp() ( ) 说的“在调用closesocket时,会向服务器端发送Fin包,所有服务器端会知道客户端要断开了”
这个怎么实现,给点参考的东西,谢谢Top
5 楼quick(我追)回复于 2005-08-05 01:03:36 得分 0
大家帮下忙,这个fin包怎么检测Top
6 楼anuoa(灌水哥)回复于 2005-08-05 02:20:08 得分 0
比如 ServerSocket与客户端连接,看ServerSocket是否等于SOCKET_INVALID 若是则客户端关闭,否则没有关闭Top
7 楼quick(我追)回复于 2005-08-06 02:53:52 得分 0
用select() 如何检测,谢谢Top
8 楼yingpf(阿飛)回复于 2005-08-06 17:23:22 得分 0
好像是不是有个FD_CLOSE的消息,不太清楚select可不可以检测这个通知。Top
9 楼younggle(洋溢)回复于 2005-08-06 17:27:38 得分 0
如果不是程序本身的原因而引起来的连接断开,我们的程序是不可能知道对方断开的。所以要发送心跳包来维护的。Top
10 楼younggle(洋溢)回复于 2005-08-06 17:30:32 得分 15
if( select() )
{
int nResult = recv();
if( nResult < 0 )
{
//断开了
}
else if(nResult == 0)
{
if( GetLastError() == 0 )
{
//断开了
}
}
}Top
11 楼hyg2008(蓝色雨)回复于 2005-08-06 19:13:03 得分 5
markTop
12 楼kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)回复于 2005-08-07 00:26:00 得分 10
不一定全对,不过你可以参考参考:
判断客户端是否断开
http://www.xiaozhou.net/cooldog/blogview.asp?logID=96Top
相关问题
- 我在.net Remoting编程中,需要将一个class的实例作为执行结果返回到客户端,不知道怎么做?
- 怎样不执行SELECT SQL语句即可获得ResultSetMetaData实例????
- 这段socket的代码为什么执行recv这个语句后就closesocket不释放端口连接了?
- (小菜一碟?)怎样让程序重复执行时自动转到已有的实例中?
- 请问程序怎样检测自己是否已经在执行着一个实例?
- 一个tns,两个数据库实例,为何执行svrmgrl总是只能登陆其中的一个?
- 请问在C#中如何保证一个执行文件只有一个实例?
- 求一个完整点的socket的重叠I/O的实例,和完成端口的实例.
- 怎样知道一个实例的监听端口号
- 实例化一个类时,会执行类的new()构造函数,当销毁一个类时,会执行哪个sub?




