在socket编程中怎么判断客户断开连接。

modicum_lf 2011-08-23 11:24:35

一道面试题!

...全文
459 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackyjkchen 2011-08-24
  • 打赏
  • 举报
回复
windows下确实好做,传统socket就……
cjcxjstc 2011-08-24
  • 打赏
  • 举报
回复
其实,客户端断开有2种情况:
1.正常断开,closesocket。
2.非正常断开,崩溃、拔网线啦。

对于第1种服务端可以知道,但是第2种就不知道了。
但是TCP协议是做了类似心跳的功能,好像是2小时检查一次吧,这个可以配置,如:
struct tcp_keepalive keepin;
struct tcp_keepalive keepout;

keepin.keepaliveinterval=5000;//10s 每10S发送1包探测报文,发5次没有回应,就断开
keepin.keepalivetime=1000*10;//60s 超过60S没有数据,就发送探测包
keepin.onoff=1;

DWORD bytesnum = 0;

int iRes = WSAIoctl(hNativeSocket,
SIO_KEEPALIVE_VALS,
&keepin,sizeof(keepin),
&keepout,sizeof(keepout),
&bytesnum, NULL,NULL);

不过个人建议还是写一个自定义的心跳包,这样控制起来比较合适。
PG 2011-08-24
  • 打赏
  • 举报
回复
一般的socket封装函数都有这个功能的,当socket无效时,都会返回错误信息的。
luciferisnotsatan 2011-08-24
  • 打赏
  • 举报
回复
recv返回0
做个心跳包。
至于收到FIN,这是TCP协议本身的东西。如果只是使用socket的TCP,那对使用者来说是透明的。
wintree 2011-08-24
  • 打赏
  • 举报
回复
发数据,又抱回来了么、???????
一叶之舟 2011-08-24
  • 打赏
  • 举报
回复
会话心跳检查。超时的认为已断开。
yby4769250 2011-08-24
  • 打赏
  • 举报
回复
这个,最典型的就是做个心跳数据包,服务器端用udp socket,定时(10秒或者一分钟什么的自己设定)给客户端发送一个空包(不承载数据),当客户端收到这个心跳包后,马上给服务器端返回这个响应包,服务器能收到客户端回复的这个包的话,就证明客户端没掉线,如果,服务器连续发送了N个包,都没收到客户端的回复的话,就证明客户端已经掉线了。或者,服务器发一个包,在规定时间内,没有收到客户端的回复的话,就证明客户端掉线了。
你可以搜索一下心跳包
Abel Lee 2011-08-24
  • 打赏
  • 举报
回复
一般都是客户端想服务器发送一些垃圾数据,当服务器在规定时间内收不到垃圾数据时,就视为客户端掉线了,可能是正常退出,可能是拔掉网线,可能是客户端崩溃了,但无论出于哪一种原因,服务器都可以中断与该客户端的链接,并作相应的回收处理。
yxqyrh 2011-08-24
  • 打赏
  • 举报
回复
mark
lzfbird 2011-08-23
  • 打赏
  • 举报
回复
给点思路,希望对你有点用,
1、正常CLOSE SOCKET,可以在服务端捕获到连接断开的消息并作处理。
2、设定的KEEP ALIVE时间范围内断开,协议栈会保持现场,一旦可以连上系统自动处理,一般无需人工干预。
3、如果还是不够保险,一般使用发送自定义存活包的方式,由客户端发到服务端,连接断开后,服务端检测到某个时间段内没有存活包到来,便可以认为客户端已经失去联系。
maoxing63570 2011-08-23
  • 打赏
  • 举报
回复
msdn:
If no error occurs, this function returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. If an error occurs, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError. The following table shows a list of possible error codes.

maoxing63570 2011-08-23
  • 打赏
  • 举报
回复
貌似select模型中是当recv可读时,但它返回0,这时就客户端就掉线了。但这只是针对于正常下线来说,对于突然拔掉网线这种坑爹的形为,你用这种方法是检测不到的。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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