服务器如何知道客户端异常断开连接?

zero1977 2003-11-11 11:59:41
如果采用发测试包处理得话,因为不可能时刻都检测,
这样服务器知道客户端连接断开总有个延时,

怎么在很短时间内知道客户端连接断开了?
...全文
564 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjdf 2003-12-02
  • 打赏
  • 举报
回复
如果这个问题很简单的话,那么对于防御SYN攻击早已有办法了。
现在有好办法么?
zoutaiqi 2003-12-02
  • 打赏
  • 举报
回复
自己设置定时器,每隔2s发个数据包测试对方是否还在线,然后做相应的处理,我就是这样做的,测试的效果还不错。
BlueEngine 2003-12-01
  • 打赏
  • 举报
回复
楼主,你可能早解决问题了,但是我还补充下吧,以方便后来的XDJM们,^_^
keepAlive并不能实时反映链路连接状况,可参考tcpip协议详解中关于tcp保活的论述.
windows2k的缺省keepalive时间为2小时,这是我试验得出的.如chenshijin(阿土)所言此值可通过注册表修改,但我不知道是哪个键值.
BlueEngine 2003-11-28
  • 打赏
  • 举报
回复
up.
to:chenshijin(阿土) :keep_alive设为true之后为什么还要改注册表啊,怎么改,你倒是说的明白点啊.
keep_alive机制是不是实时反映链路连接状况呢?
danfeng 2003-11-27
  • 打赏
  • 举报
回复
tcp可以保证在短时间内自动连接
williamxia8 2003-11-27
  • 打赏
  • 举报
回复
就使用心跳来检测吧,在某几个时间周期内得不到客户端的反馈信息,就认为客户端已经断开
danfeng 2003-11-26
  • 打赏
  • 举报
回复
如果是tcp 其中一方异常断开 另外一方send会返回错误
如果是udp 需要自己做确认机制 如果没有收到确认返回 则认为另一方异常断开
mingcedar 2003-11-26
  • 打赏
  • 举报
回复
我现在作的程序也遇到同样的问题。

如用发测试包的方法,测试时间设得长,会有延时。设得短,如果有很多客户相连(比如1000人),是不是会占用太多的服务器资源。

to:chenshijin(阿土) :怎样用SetSockOpt来设置keepalive属性,怎样修改注册表?能否说详细一些?
dxp 2003-11-26
  • 打赏
  • 举报
回复
直接看send,recv的返回值就行了吧,或者GetLastError

我顺便问一下,是不是网络意外断开后重新连接,非要重新connect才能继续传送数据啊?
connect开销比较大啊!
joinrry 2003-11-12
  • 打赏
  • 举报
回复
发测试包的方法不错啊,其实很多也是这样作的!

测试时间可以设置小一点啦!
zero1977 2003-11-12
  • 打赏
  • 举报
回复
都说了是异常断开,比如突然断电等,套接字是不会被关闭的
zero1977 2003-11-12
  • 打赏
  • 举报
回复
int iValue = 1;
setsockopt( sockfd, SOL_SOCKET, SO_KEEPALIVE, (char*)&iValue, sizeof(iValue) ) ;

用这个就可以吗? 该注册表什么?
突然断电,服务器也能知道吗???
chenshijin 2003-11-12
  • 打赏
  • 举报
回复
你在服务器端可以采用SetSockOpt来设置keepalive属性,同时修改注册表,这样出现客户端异常退出的时候,服务器端就能够知道,并且上报应用层
ljzcom 2003-11-11
  • 打赏
  • 举报
回复
UP
happyhuang 2003-11-11
  • 打赏
  • 举报
回复
客户端连接断开之后套接字会被关闭的,服务器可以通过检测套接字关闭之后的GetLastError()返回值来判断是否是客户端连接断开。

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧