如何判断socket判断客户端断开已经断开

主题 : 如何判断CFSocketRef 连接已经断开
级别: 侠客
可可豆: 492 CB
威望: 492 点
在线时间: 86(时)
发自: Web Page
来源于&&分类
如何判断CFSocketRef 连接已经断开&&&
用CFSocketRef 类创建一个客户端,成功连接一个服务器端后,如果服务器端主动断开,请问客户端有没响应事件?或者能否主动去判断连接是否已经断开?
级别: 侠客
可可豆: 492 CB
威望: 492 点
在线时间: 86(时)
发自: Web Page
都没有人知道吗?提供一下源码吧!
描述:CFSocketRef 类的TCP通信Demo
(548 K) 下载次数:55
级别: 侠客
可可豆: 492 CB
威望: 492 点
在线时间: 86(时)
发自: Web Page
全局只有这个回传函数,但没有响应断开连接的事件,真不知道有什么办法啦!static void TCPServerConnectCallBack(CFSocketRef socket, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) {...}这是初始化的方法:..._socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketConnectCallBack, TCPServerConnectCallBack, &CTX);...各位发表发你们的高见吧。
级别: 侠客
可可豆: 492 CB
威望: 492 点
在线时间: 86(时)
发自: Web Page
怎么还是没有人回答呢!我折腾好久,没有好的结果,有谁能告诉一下不,谢谢啦!
级别: 精灵王
可可豆: 5235 CB
威望: 5235 点
在线时间: 410(时)
发自: Web Page
回 3楼(abinse) 的帖子
我也再弄这个,有个想法,就是服务端定时发送数据过来,如果一段时间内没有收到就判断为断开
级别: 侠客
可可豆: 652 CB
威望: 652 点
在线时间: 142(时)
发自: Web Page
可以用客户端请求数据超时来给出提示,比如服务端已经关闭(一般没必要向客户端发送关闭信息),客户端主动请求数据,失败后隔一段时间再尝试,如此反复超过一定次数后可判断服务器可能关闭。
级别: 侠客
可可豆: 1332 CB
威望: 1332 点
在线时间: 97(时)
发自: Web Page
我用AsyncSocket强大,简单好用,还是开源的。
级别: 精灵王
UID: 40471
可可豆: 3639 CB
威望: 3620 点
在线时间: 836(时)
发自: Web Page
嗯,用那个开源的多好啊 。。我就是用的那个,很方便。
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版博客分类:
工程里遇到了需要判断Socket是否已经关闭的问题,使用
public boolean isAlive(){
if(mSocket.equals(null)||mSocket.isClosed()||!mSocket.isConnected()||mSocket.isInputShutdown()||mSocket.isOutputShutdown()){
MyLog.d("mSocket.isConnected()"+mSocket.isConnected());
MyLog.d("mSocket.isConnected()"+mSocket.isConnected());
毫无作用,随后查看了网上先关解决办法,发现Socket中有一个方法void sendUrgentData(0xFF)当对方SO_OOBINLINE属性没有打开时,就会自动舍弃这个字节,而SO_OOBINLINE属性默认情况下就是关闭的,但是只要能够发送到对方Socket,sendUrgentData(0xFF)方法就不会报错,只要catch一下IOException就OK了,当对方关掉了Socket之后就会进入catch,问题迎刃而解。
mSocket.sendUrgentData(0xFF);
}catch(IOException e){
Log.d(e+":要关掉了阿 !");
mSocket.close();
当socket断掉之后,抛出java.net.socketexception broken pipe异常,没有问题。
浏览 18737
浏览: 93447 次
来自: 北京
Hi friendi got an issue when tr ...
我的是一个国产平板,就是识别不了,windows上也不行,用一 ...
Eyal 写道为什么返回的是指针。。还是没明白我觉得这是Jav ...
为什么返回的是指针。。还是没明白
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Java Socket 如何判断客户端断开
作者:用户
浏览:399 次
我做了个多线程的服务器程序线程中等待客户端的消息部分代码如下:booleandone=clientRequest.isConnected();//判断客户端Socket是否连接while(done)/
问题描述我做了个多线程的服务器程序线程中等待客户端的消息部分代码如下:booleandone=clientRequest.isConnected();//判断客户端Socket是否连接while(done)//客户端是连接的{try{input=clientRequest.getInputStream();Binput=newBufferedInputStream(input);str=""+Binput.read();if(Binput.read()!=-1)//如果客户端有消息就打印出来{System.out.println(str);}}catch(IOExceptione){e.printStackTrace();}if(clientRequest.isclosed())//判断Socket是否关闭{done=//如果关闭,就跳出无限循环(while)}}我的代码能实现服务器与客户端的通信问题是:当客户端中断或退出以上代码却不能判断Socket中断跳不出while的无限循环请哪位大侠指点一二小弟不慎感激......解决方案解决方案二:catch(IOExceptione){e.printStackTrace();}在这里改成catch(Exceptione){}试试解决方案三:还是不行当客户端断了后服务器站cup100%解决方案四:客户端发送关闭消息告诉服务器客户端要关了,关闭消息自己定义,比如发送个close字符串,表示客户端要关闭连接,服务器解析到这个字符串,就跳出循环,结束连接。解决方案五:我做的是跟一给网络设备进行通信它会发固定长度的数据而且它的模块是该不了的不能设定它发来的是什么数据所以楼上的方法行不通啊解决方案六:顶顶顶解决方案七:isConnect()方法啊解决方案八:设置timeout时间解决方案九:如果不行的话,可以用heartbeat来保活连接如果得不到心跳包就是连接丢失了......解决方案十:路过解决方案十一:以上方法都是没用的!try{socket.sendUrgentData(0);}catch(IOExceptione){//如果抛出了异常,那么就是断开连接了}解决方案十二:抛异常或者从客户端的输入流里读出的是null,这时就说明客户端已经断开.一般情况下,客户端断开都能读到一个null.解决方案十三:try{socket.sendUrgentData(0);}catch(IOExceptione){//如果抛出了异常,那么就是断开连接了}就是所谓的心跳测试,但是在本人实践中,发现它并不总是凑效。有时候明明测试过了,但是就是发不出数据,也读不到,最终timeout.解决方案十四:设置延迟断开,这需要拥有监控线程。曾经很多人利用这种特性攻击过HTTP服务器,后来用延迟断开解决这个问题的。解决方案十五:if(Binput.read()!=-1)//如果客户端有消息就打印出来这句返回0和-1类似意思不一样,你试试看。解决方案:跟帖拿分解决方案:引用11楼inhibitory的回复:从客户端的输入流里读出的是null,这时就说明客户端已经断开.+try{socket.sendUrgentData(0);}catch(IOExceptione){//如果抛出了异常,那么就是断开连接了}解决方案:谢谢各位大侠的回复我搞定了总结一下:1.while(Binput.read()!=-1)这种方法能判断出客户端输入是否为空客户端断开能跳出死循环但是我想得到的数据却从第二个开始了所以这方法不适宜2.用下面的方法就没问题了在死循环中加入以下代码try{socket.sendUrgentData(0);}catch(IOExceptione){done=//如果抛出了异常,那么就是断开连接了跳出无限循环}10楼16楼说的没错12楼说的情况我暂时没有遇到谢谢散分...解决方案:貌似还是有问题啊就是开始用teinet命令去连接我的服务器然后关闭dos命令窗口代码能跳出无限循环但是我去关闭我的设备时就没什反应我再次连上设备后Java出错信息是:java.net.SocketException:Connectionreset麻烦给点意见解决方案:楼主,你18楼出现情况是正常的,如果要解决该问题,请确认:1.当关闭网络设备后,是否有什么消息会发给你的服务端程序?从你以上描述看,应该是断就断了,没有反应了。2.是否先要启动你的服务端程序,再启动那个网络设备?如果先启动网络设备,再启动你服务器会有什么结果?解决方案:19楼1.对网络设备在断开时是不会发送消息给服务器的2.无论先启动设备还是先启动我的服务器都能正常连接也能正常收到设备的数据问题是:当设备断开时我却不知道如何判断它断开了?解决方案:catch(Exceptione){System.out.println("客户机:"+socket.get忘记了+"离开了");}解决方案:while(true){try{in.read();}catch(Exceptione){in.close();socket.close();}}我都这样写,没遇到什么问题!解决方案:引用20楼hehebw的回复:19楼1.对网络设备在断开时是不会发送消息给服务器的 2.无论先启动设备还是先启动我的服务器都能正常连接也能正常收到设备的数据 问题是:当设备断开时我却不知道如何判断它断开了?如果是这样的话,你就不要判断那个网络设备断来了,因为当网络设备断开时候是没有消息发送给服务器的,而此时服务器正等待网络设备发送。当网络设备第二次连接上来时候,服务器就会抛异常,原因是已经不是第一次的网络连接了,所以你需要做的,当收到上面那个异常后,就重新启动一个新的socket(由于我问的第二点,无论先启动哪个都能正常连接,所以这样做是可以的)解决方案:进了循环体以后如果断了,isConnected判断就判不出来了,只能下次开始循环的时候检查,还是拿报错来判断的好。代码没细看。还有什么问题再问吧。解决方案:23楼没有别的办法了吗?重新开个Socket那是不是要重新开线程啊?那我怎么跳回到线程的开始呢?24楼问题是捕获不到断开时的报错啊解决方案:捕获的应该是流获取不到的错。运行的时候最长的时间应该是阻塞在从流里获取数据的地方,断开的时候程序一般也都停在这里,监听这里就行了,我自己做过这样的东西,就是这么处理的,isConnected基本没用。解决方案:很简单,加一个读取Buffer的函数read,这是个阻塞函数,用cSocket.setSoTimeout(2000)来设定其超时时间,抛出错误,判断其返回值,如果返回值不大于0,则表示客户端已经断开。解决方案:用那个什么Is什么的都没有用的!解决方案:read读到-1时,客户端就关掉了
【云栖快讯】红轴机械键盘、无线鼠标等753个大奖,先到先得,云栖社区首届博主招募大赛9月21日-11月20日限时开启,为你再添一个高端技术交流场所&&
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
开发者常用软件,超百款实用软件一站式提供TCP socket如何判断连接断开 - CSDN博客
TCP socket如何判断连接断开
SO_KEEPALIVE是系统底层的机制,用于系统维护每一个tcp连接的。
心跳线程属于应用层,主要用于终端和服务器连接的检查。
即使SO_KEEPALIVE检测到连接正常,但并不能保证终端和服务器连接的正常。有一种情况,服务器进程死了,但它和客户端的tcp连接还连着(该连接由系统维护的)。
这就是SO_KEEPALIVE不能取代心跳线程的原因吧。
###############################
& & &最近在做一个TCP采集程序,使用到C/S的结构。功能比较的简单,就是TCP采集程序作为服务器,信令采集设备作为客户端,客户端与服务器端之间建立长连接之后,开始发送信令报文给服务器。在服务器端使用多线程方式来处理每个客户端的socket连接,服务器端不主动断开链路,也没有心跳机制来维护连接的状态,客户端发送数据的时间也是不一定的,只要有采集到信令数据时才进行发送。在客户端socket断开后,服务器端应该能够知道并且释放socket资源。
& & &判断socket是否已经断开的方法是使用非阻塞的select方式进行socket检查,步骤如下:
1)设置接收到的socket为异步方式;
2)使用select()函数测试一个socket是否可读;
<span style="color:#)如果select()函数返回的&#20540;为1,但是使用recv()函数读取的数据长度为0,那么说明该socket已经断开。
<span style="color:#)如果recv()返回&#20540;小于等于0时,客户端的连接已经断开,但是还需要判断errno是否等于EINTR。如果errno=EINTR则说明recv()函数是由于程序接收到中断信号后返回的,socket连接应该还是正常,步应该close掉socket连接。
注:对于阻塞socket的recv函数会在以下三种情况下返回&#20540;:
1)接收到数据时会返回;
2)程序接收到信号时返回-1,errno=EINTR;
3)Socket出现问题时,返回-1,具体的错误码请查看
4)一定要养成查看man说明,内容很详细,很有帮助。
这种方法经过长时间的测试证明是有效的,仅供大家参考。
& & &此外,UNP卷一上有很多socket异常情况下的模拟解释,大家可以去阅读下。如果网络中间有多级路由,路由当掉等很多情况出现,所以建议程序中在应用层中加入心跳(heartbeat机制)和重连来维持连接的状态。
& & &&TCP protocol has a timer to determine if the connection is abnormally closed. But this timeout value is very long by default and if you want to check this situation as soon as possible to improve
performance, the best solution is to introduce a keepalive mechanism in application protocol design.
& & &&TCP协议有一个定时器来决定连接是否被异常关闭。但是该超时时间&#20540;缺省的情况下会非常长,如果你希望尽快的检查出这种状态改进性能,最好的方法就是在应用程序协议设计的时候引入keepalive(保持连接)机制。
########################################
& & &最近在做一个服务器端程序,C/S结构。功能方面比较简单就是client端与server端建立连接,然后发送消息给server。我在server端会使用专门的线程处理一条socket连接。这就涉及到一个问题,如果socket连接断开(异常,正常)后,我如何才能感知到?server端这边是绝对被动的,sever端不能主动断开连接。也没有连接链路维持包之类的。client端发送数据的时间也是不定的。在socket连接断开后,server要能够感知到并释放资源。
& & &这个问题在思考测试,询问同事之后,找到了一个方法,可以做到这一点。
& & &当使用 select()函数测试一个socket是否可读时,如果select()函数返回&#20540;为1,且使用recv()函数读取的数据长度为0
时,就说明该socket已经断开。
& & &为了更好的判定socket是否断开,我判断当recv()返回&#20540;小于等于0时,socket连接断开。但是还需要判断
errno是否等于 EINTR 。如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。
PS:对于堵塞socket的recv函数会在以下三种情况下返回:
(1)recv到数据时,会返回。
(2)在整个程序接收到信号时,返回-1。errno = EINTR。//在程序的起始阶段,屏蔽掉信号的除外。部分信号还是屏蔽不掉的。
(3)socket出现问题时,返回-1.具体错误码看 man recv()
(4)一定要看 man 说明,很详细,很有帮助。
这种方法经过长时间测试后,是有效的。所以写出来让大家参考一下,请大家发表意见。
本文已收录于以下专栏:
相关文章推荐
1, 如果服务端的Socket比客户端的Socket先关闭,会导致客户端出现TIME_WAIT状态,占用系统资源。
所以,必须等客户端先关闭Socket后,服务器端再关闭Socket才能避免TI...
新公司在做物联网,要做与modbus设备的通讯服务。在过程中除了研究modbus协议外,最麻烦的就是设备在线状态的检测问题。
Socket本身无法很好的捕获连接断开事件,或者说根本没这功能。总不能每...
尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。
TCP提供一种面向连接的、可靠的字节流服务。
TCP协议介绍面向连接意味着两个使用 TCP的应用(通常是一...
检测socket链接是否断开
1. 用read函数来判断&#160;读到长度0不能断定是已经断开.除非是-1,才代表输入流已经被关闭,说名socket已经close,而且关键在于你怎么读,实际上应该是一个单独的线程一直在读,因为你无法预先知...
Socket在连接以后,如果客户端非正常退出,比如网线掉了、超时退出等,服务器端的socket仍然有缓存,此时可以从该socket描述符中读出一些数据,短时间内甚至可以写,因此判断TCP socket...
原文出自:/youxin/p/4056041.html
一篇文章:
最近在做一个服务器端程序,C/S结构。功能方面比较简单就是clie...
TCP socket网线断开判断
此文章为转载,转载路径:/a/17107.htm
此方法可行,经过自己的验证!
&#160; &#160;有些网络应用在网线...
运行环境:linux 语言:c++ TCP连接断线后, &#160;&#160;&#160;&#160;&#160;1.正常断线,如何检测? &#160;&#160;&#160;&#160;&#160;2.意外掉线,如何检测? &#160; 我不希望通过发送数据来检测TCP连接! &#160; 谢谢...
下面来罗列一下判断远端已经断开的方法:
当recv()返回值小于等于0时,socket连接断开。但是还需要判断 errno是否等于 EINTR,如果errno == EINTR 则说明re...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 108, 距离下一级还需 92 积分
论坛徽章:0
socket的一个客户端,与服务端相连后,发送报文。
但是服务端有时候会自己断开服务,
通讯断开后,客户端往服务段发送报文,客户端调用write时,没有报错,&&errno 也没有问题, 也没有收到SIGPIPE信号量。 所以无法获知 通讯已断开。
导致客户端发送信息丢失。
自己网上查了半天,也没找到解决方法
如果自己调用 shell& &取netstat -na&&的 返回值 来判断 通讯行么?
好像这样也太粗糙了阿
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
巨富豪门, 积分 26507, 距离下一级还需 13493 积分
论坛徽章:13
原帖由 pingping09 于
15:40 发表
socket的一个客户端,与服务端相连后,发送报文。
但是服务端有时候会自己断开服务,
通讯断开后,客户端往服务段发送报文,客户端调用write时,没有报错,&&errno 也没有问题, 也没有收到SIGPIPE信号量。 所 ...
没有办法!
因为网络的情况太复杂。你的直连网口出问题是可以收到信号的,远端路由出问题,inet规定,丢弃报文,并不提供任何表示。
[ 本帖最后由 yulihua49 于
15:50 编辑 ]
大富大贵, 积分 10265, 距离下一级还需 9735 积分
论坛徽章:237
要求对方确认,否则重发
家境小康, 积分 1876, 距离下一级还需 124 积分
论坛徽章:0
回复 #1 pingping09 的帖子
LZ用的是TCP吧~
LZ所指的“断开”是什么意思?TCP连接断开?还是物理连接断开?
如果是TCP连接断开(正常经历了TCP断开的握手过程),那么write是会返回错误的~
如果不是TCP连接断开,这种情况只能通过“保持活动”的方式来不断进行探测。比如约定对方每10秒会发一个保活报文过来,如果你20秒还没收到,就认为已经断开了。
白手起家, 积分 108, 距离下一级还需 92 积分
论坛徽章:0
回复 #4 kouu 的帖子
是TCP连接断开啊,而且 每次如果断开了, 客户端发送报文第一笔不报错,都正常,发第二笔的时候系统会收到SIGPIPE信号。
服务端是其他公司提供的,很难弄啊,郁闷
家境小康, 积分 1876, 距离下一级还需 124 积分
论坛徽章:0
回复 #5 pingping09 的帖子
有个疑问,你怎么确定TCP连接已经断开了? 抓包看过TCP的断开过程已经完成了? 还是通过别的什么现象推断的?
白手起家, 积分 108, 距离下一级还需 92 积分
论坛徽章:0
原帖由 kouu 于
17:47 发表
有个疑问,你怎么确定TCP连接已经断开了? 抓包看过TCP的断开过程已经完成了? 还是通过别的什么现象推断的?
我直接netstat -na|grep ip
看状态看出来的
还有我在服务段这边的软件也看到断开了
白手起家, 积分 139, 距离下一级还需 61 积分
论坛徽章:0
原帖由 pingping09 于
18:11 发表
我直接netstat -na|grep ip
看状态看出来的
还有我在服务段这边的软件也看到断开了
好方法,我一般按照4楼的方法去做,下次试试这个方法,可以偷懒
白手起家, 积分 108, 距离下一级还需 92 积分
论坛徽章:0
回复 #1 pingping09 的帖子
调用 shell& &取netstat -na&&的 返回值 来判断 通讯行不行啊?
我觉得这样好像简单很多
家境小康, 积分 1876, 距离下一级还需 124 积分
论坛徽章:0
回复 #9 pingping09 的帖子
用netstat来判断一个连接是否断开应该是可以的吧~(判断是否没断开就不行了)
不过你的程序在连接断开后写数据不会返回错误,这个就比较神奇了……莫非你不是直接用的write,而是用fwrite之类的?
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处

我要回帖

更多关于 判断socket是否断开 的文章

 

随机推荐