社区
网络编程
帖子详情
如何判断一个socket连接已经中断?
zpplayer
2004-06-22 10:05:35
当然是不指忘能收到FD_CLOSE事件,也不能通过主动Send数据来检测(作为被动接收的客户端在连接到服务器后就一直处于接收状态,而且协议上没有“心跳”监测连接的支持)。如果这时拔掉服务器的网线或者中间的交换机、路由器等硬件故障导致连接在物理链路上已经中断掉,请问有什么办法能检测出来?忘各位大侠不吝赐教,小生感激不尽。
...全文
463
16
打赏
收藏
如何判断一个socket连接已经中断?
当然是不指忘能收到FD_CLOSE事件,也不能通过主动Send数据来检测(作为被动接收的客户端在连接到服务器后就一直处于接收状态,而且协议上没有“心跳”监测连接的支持)。如果这时拔掉服务器的网线或者中间的交换机、路由器等硬件故障导致连接在物理链路上已经中断掉,请问有什么办法能检测出来?忘各位大侠不吝赐教,小生感激不尽。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
Linux内核源代码情景分析 (上下册 高清非扫描 )
2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2.9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址映射 2.12 ...
python如何
判断
tcp异常断开_如何
判断
TCP
连接
已经
中断
?
用Python写网络应用是很常见的,因此
一个
常见的问题就是,如何在Python代码中
判断
TCP链接
已经
中断
?TCP有
连接
,如果通讯的某一方
中断
的
连接
,另外一方在
socket
层面如何感知?这个问题我也是经过一番挣扎才搞清楚的。...
Python网络编程(
socket
)
答案就是
socket
.
socket
翻译为套接字,它本质就是在应用层和传输层(TCP/IP协议族通信)之间的
一个
抽象层,是一组接口,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。该课程包括OS...
怎样实时
判断
socket
连接
状态?
这种情况下,协议栈会走正常的关闭状态转移,使用epoll的话,一般要
判断
如下几个情况 处理可读事件时,在循环read后,返回结果为0 处理可写事件时,write返回-1,errno为EPIPE EPOLLERR或EPOLLHUP或事件 对...
linux C语言
socket
如何
判断
socket
_fd对应的
socket
是否断开?(是否连通、是否正常
连接
)recv()、tcp_info TCP_ESTABLISHED、keepalive
文章目录
判断
socket
连接
断开的方法法一法二法三法四说明有关SO_KEEPALIVE的三个参数详细解释如下法五
判断
socket
连接
断开的方法 法一 当recv()返回值小于等于0时,
socket
连接
断开。但是还需要
判断
errno是否等于 ...
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章