如何判断一个socket连接已经中断?

zpplayer 2004-06-22 10:05:35
当然是不指忘能收到FD_CLOSE事件,也不能通过主动Send数据来检测(作为被动接收的客户端在连接到服务器后就一直处于接收状态,而且协议上没有“心跳”监测连接的支持)。如果这时拔掉服务器的网线或者中间的交换机、路由器等硬件故障导致连接在物理链路上已经中断掉,请问有什么办法能检测出来?忘各位大侠不吝赐教,小生感激不尽。
...全文
463 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangchinaking 2004-06-23
  • 打赏
  • 举报
回复
通过Recv()方法行不通,本人已经测试过了,无论何种情况下Recv()均会返回WOULDBLOCK的SOCK_ERROR事件,并查明无类似CONNRESET的事件触发,因此想通过这样简单的办法达到检测TOCKET是否活动,几乎不可能,不然的话,我昨晚的加班不是白费了吗?
退一步的做法只能是实施脉搏信号机制。
zpplayer 2004-06-23
  • 打赏
  • 举报
回复
up
zpplayer 2004-06-23
  • 打赏
  • 举报
回复
多谢大家的支持,小生这里先谢过了。
不知还有没有其它的高见?望大家不吝赐教。
phiger 2004-06-23
  • 打赏
  • 举报
回复
用个单独的线程,阻塞recv,只是peek一下数据,而不真正取走,如果出错,说明连接断掉了
csyw 2004-06-23
  • 打赏
  • 举报
回复
up
phiger 2004-06-23
  • 打赏
  • 举报
回复
如果你的交换机、路由器允许icmp包的话,可以用一个单独线程,定时通过icmp包检测链路
Crob 2004-06-23
  • 打赏
  • 举报
回复
如hhhaaa(hhhaaa) 所说,就OK了。
顾君彦 2004-06-22
  • 打赏
  • 举报
回复
要是TCP的话一直等着读服务器端,当服务器主动断开或网络中断时,读流时会出错的。
一般是出现0或-1。
要是udp的话,那就得用上面兄弟说的心跳了。

zpplayer 2004-06-22
  • 打赏
  • 举报
回复
服务器端是别人已经提供了的,我无法对服务器端抱任何幻想。想一秒钟发一个字符的想法是不可能的。
zhonglingqqxh 2004-06-22
  • 打赏
  • 举报
回复
是不是也可以用ping功能啊
carbon107 2004-06-22
  • 打赏
  • 举报
回复
可以一秒钟发一个字符啊. 当这一秒没有接收到,那么就是断了
zpplayer 2004-06-22
  • 打赏
  • 举报
回复
up
MFCClass 2004-06-22
  • 打赏
  • 举报
回复
窗口消息 or 事件 or 自己做的消息
hhhaaa 2004-06-22
  • 打赏
  • 举报
回复
用以下函数,sdin是socket连接句柄,判断这个SOCKET连接目前是否有效。
你可以将CSocket::m_hSocket做为参数传进去

BOOL HasConnectionDropped(int sdin)
{
BOOL bConnDropped = FALSE;
INT iRet = 0;
BOOL bOK = TRUE;

if (sdin == INVALID_SOCKET)
return TRUE;

struct timeval timeout = { 0, 0 };
fd_set readSocketSet;

FD_ZERO(&readSocketSet);
FD_SET(sdin, &readSocketSet);

iRet = ::select(0, &readSocketSet, NULL, NULL, &timeout);
bOK = (iRet > 0);

if(bOK)
{
bOK = FD_ISSET(sdin, &readSocketSet);
}

if(bOK)
{
CHAR szBuffer[1] = "";
iRet = ::recv(sdin, szBuffer, 1, MSG_PEEK);
bOK = (iRet > 0);
if(!bOK)
{
INT iError = ::WSAGetLastError();
bConnDropped = (( iError == WSAENETRESET) ||
(iError == WSAECONNABORTED) ||
(iError == WSAECONNRESET) ||
(iError == WSAEINVAL) ||
(iRet == 0));
}
}
return(bConnDropped);
}
PiggyXP 2004-06-22
  • 打赏
  • 举报
回复
楼主不会是在做木马,用的人家的server端吧 呵呵^_^

这种情况确实是不大好办了,如果能ping到那台主机的话,就只能自己写ping了

比较麻烦一些,但也是个办法


zpplayer 2004-06-22
  • 打赏
  • 举报
回复
up

18,356

社区成员

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

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