c# 如何判断socket连接断开?

问题描述

privatevoidtimer1_Tick(objectsender,EventArgse){if(socket!=null&&socket.Connected){if(socket.Poll(1,SelectMode.SelectRead)){try{byte[]temp=newbyte[1024];intnRead=socket.Receive(temp);if(nRead==0){MessageBox.Show("000连接已断开了,请处理");}}catch{MessageBox.Show("连接已断开了,请处理");}}try{intii=socket.Send(newbyte[1]);}catch(SocketExceptionse){if(se.ErrorCode==10054)//ErrorcodeforConnectionreset{MessageBox.Show("连接已断开了,请处理");}else{MessageBox.Show(se.Message);}}}}目前我用一个定时器来做心跳发送包,但先和服务端连接上,再把网络禁用了我这边的客户端一点反应也没有,禁用后,我不停的发包一切也正常没有异常,socket.Connected一直为true如果才能知道服务端已断开连接了呢

解决方案

解决方案二:
不是很熟悉帮顶
解决方案三:
新手,高手来
解决方案四:
应该有一个超时设置吧!
解决方案五:
给个例子看看呀各位,这问题真把我搞晕了
解决方案六:
呃,是客户端向服务端发包还是服务端向客户端发哦?
解决方案七:
if(socket!=null&&socket.Connected)既然检查了socket.Connected属性,又何必加个socket!=null?没有得到任何对象socket.Connected自然是false试试把发信息和接收信息分写在两个Timer中,要是能分别做到两个窗体里就更好了.
解决方案八:
用socket连接一般都是若服务器断开了连接,客户端是不会报异常的,而如果是客户端断开了连接,服务器是会出现异常的这个问题其实也很好的,不管是哪边断开都发送一条特殊的我们一般情况下不会输的指定,当对方收到的若是这样的指令,就表明已经断开了连接,自己也可以断开不需要再连接了
解决方案九:
我前两天也遇到过一模一样的问题!后来采用了比较原始的方法就是在心跳测试中调用ping命令去ping服务器,ping不通就报异常。lz不妨试试
解决方案十:
心跳检测。google一下
解决方案十一:
前两天还遇到了和lz相同的问题后来用了个土法解决的,就是在心跳代码中去ping,ping不通就报异常
解决方案十二:
if(socket.Poll(100,SelectMode.SelectRead)){if(socket.Available==0)thrownewException("网络断了");}这里的轮询间隔是以微秒(百万分之一秒)计算的,不用设得太小了
解决方案十三:
能给出代码例子看一下吗
解决方案十四:
引用11楼westfly的回复:

if(socket.Poll(100,SelectMode.SelectRead)){if(socket.Available==0)thrownewException("网络断了");}这里的轮询间隔是以微秒(百万分之一秒)计算的,不用设得太小了

我把网线拔掉了,但是if(socket.Poll(100,SelectMode.SelectRead))总是为false不能执行进来
解决方案十五:
Poll只能用于检测网络电缆正常且远程主机不关闭的情况,其他的情况需要借助Read/Send数据时捕捉错误码来判断了(在一个长连接中可以借助心跳包来处理)
解决方案:
constintkeepAlive=-1744830460;//SIO_KEEPALIVE_VALSbyte[]inValue=newbyte[]{1,0,0,0,0x10,0x27,0,0,0xe8,0x03,0,0};//True,10秒,1秒TcpSock.IOControl(keepAlive,inValue,null);//Sock.IOControl(IOControlCode.KeepAliveValues,inValue,null);//设置KeepAlive为10秒,检查间隔为1秒。如果拨掉客户端网线//服务器的Socket.Receive()会在10秒后断开连接
解决方案:
SocketEvent是事件Socket_e是事件参数外部对象获得SocketEvent事件进行重连操作即可读的线程终止就可以了.这只是一个类中的SOCKET读线程操作示例://接收线程publicvoidThread_Read(){while(true){try{if(socket.Poll(-1,SelectMode.SelectRead)){byte[]bytes=newbyte[socket.ReceiveBufferSize];intbytesRec=socket.Receive(bytes);stringdata=Encoding.UTF8.GetString(bytes,5,bytesRec);Rec_e.vDataPack=data;RecEvent(this,Rec_e);if(bytesRec==0){//socket连接已断开Socket_e.ResCode="00000";SocketEvent(this,Socket_e);return;}}elseif(socket.Poll(-1,SelectMode.SelectError)){//TODO:SOCKET错误}}catch(SocketExceptione){//10035==WSAEWOULDBLOCKif(e.NativeErrorCode.Equals(10035)){//仍然处于连接状态,但是发送可能被阻塞}else{//连接错误,返回错误代码:e.NativeErrorCodeSocket_e.ResCode=e.NativeErrorCode.ToString();SocketEvent(this,Socket_e);return;}}}}

解决方案:
学习
解决方案:
如果正常close的话可以读下他connection熟悉如果强制断开那么在另外一边会抛出异常
解决方案:
socket有个属性好象叫connect
解决方案:
Poll方法将会检查Socket的状态。指定selectMode参数的SelectMode..::.SelectRead,可确定Socket是否为可读。指定SelectMode..::.SelectWrite,可确定Socket是否为可写。使用SelectMode..::.SelectError检测错误条件。Poll将在指定的时段(以microseconds为单位)内阻止执行。如果希望无限期的等待响应,则将microSeconds设置为一个负整数。如果要检查多个套接字的状态,则不妨使用Select方法。此方法不能检测某些类型的连接问题,例如,网络电缆中断或远程主机意外关闭。您必须尝试发送或接收数据以检测这些类型的错误。这个是我在http://technet.microsoft.com/zh-cn/system.net.sockets.socket.poll.aspx上看的,够权威吧,看来只能发一个特殊的东西给socket的另一方,再在对方的逻辑里写上收到的是这个特殊的东西就回发一个特殊的东西。这样才能保证socket还能用。而且还有。poll方法是向socket里写或者读出一部分数据,这样的话,如果你其他的线程也在接收socket里的数据的话,就会接收不全了,我在做一个远程通信软件时也遇到这样的问题。希望你能看到我这条回复,如果你已有好的解决办法,麻烦你给我留言,十分感谢!我也被这个问题困扰好久了。
解决方案:
在学习这面得只是,谁有没有一个完整的代码能供我参考下!
解决方案:
应该等待对方的ACK,这样才能确认发送成功超过一定时间没有收到ACK,就重发。如果重发连续N次没收到ACK,就认为对方断开连接。
解决方案:
privatevoidtimer1_Tick(objectsender,EventArgse){if(socket!=null&&socket.Connected){if(socket.Poll(1,SelectMode.SelectRead)){try{byte[]temp=newbyte[1024];intnRead=socket.Receive(temp);if(nRead==0){MessageBox.Show("000连接已断开了,请处理");}}catch{MessageBox.Show("连接已断开了,请处理");}}try{intii=socket.Send(newbyte[1]);}catch(SocketExceptionse){if(se.ErrorCode==10054)//ErrorcodeforConnectionreset{MessageBox.Show("连接已断开了,请处理");}else{MessageBox.Show(se.Message);}}}}

解决方案:
http://www.cnblogs.com/caoguanghong/archive/2008/09/19/1293943.html
解决方案:
keep-alive进行自动检测
解决方案:
引用16楼much0726的回复:

SocketEvent是事件Socket_e是事件参数外部对象获得SocketEvent事件进行重连操作即可读的线程终止就可以了.这只是一个类中的SOCKET读线程操作示例:C#code//接收线程publicvoidThread_Read(){……

+++
解决方案:
oh,这样啊
解决方案:
这帖子还没结?哪个可用?

时间: 2024-09-04 06:11:45

c# 如何判断socket连接断开?的相关文章

udp-python的socket UDP 断开,重连问题

问题描述 python的socket UDP 断开,重连问题 我使用socket模块,刚开始server和client都能发送和接受数据,但等待一段时间后 server能发送数据,但client显示没接受到数据,这应该是client断开连接,请教下该怎么 重新连接server? 解决方案 server需要跟client之间有一个心跳机制,当发现client断开了,就清除这个socket连接,而client端发现断开了,就重新连接server 解决方案二: python socket问题关于判断S

zookeeper 大量连接断开重连原因排查

问题现象 最后发现线上的zookeeper的日志zookeeper.out 文件居然有6G,后来设置下日志为滚动输出,参考: http://blog.csdn.net/hengyunabc/article/details/19006911 但是改了之后,发现一天的日志量就是100多M,滚动日志一天就被冲掉了,这个不科学. 再仔细查看下日志里的内容,发现有很多连接建立好,马上又断开: 2014-11-24 15:38:33,348 [myid:3] - INFO [NIOServerCxn.Fac

通信-android 客户端socket连接服务器,socket何时close

问题描述 android 客户端socket连接服务器,socket何时close 假设socket连接好了,现在客户端向服务器发送完了数据,这个时候需要关闭socket吗?如果关闭后,某个时候又需要发送其他数据,再建立连接? 还是说建立通信协议,一次socket连接后一直保持通信状态,根据通信协议对不同的数据进行不同的处理,然后等客户端程序退出时再关闭socket. 解决方案 Android客户端通过Socket连接服务器Android客户端与java服务器端的Socket连接Socket服务

java socket连接池的问题

问题描述 应用场景:前端使用JSF作为表现层,浏览器客户端发出请求时我必须先通过socket与集群服务器进行通信之后在将服务器的响应信息进行解析再展现给客户端,为了减少系统开销,我打算在socket这一层使用socket连接池的方式实现.但是目前遇到一个问题,我从池中取出一个socket后不能判断出该socket是否已经被服务器端关闭了连接,如果服务器端已经关闭了连接,我必须创建一个新的socket,然后对上一次发送失败的请求进行重发处理.但是,在判断socket是否已经被服务器端关闭这一点,是

Linux下Socket连接超时的一种实现方法

目前各平台通用的设置套接字(Socket)连接超时的办法是: 创建套接字,将其设置成非阻塞状态. 调用connect连接对端主机,如果失败,判断当时的errno是否为EINPROGRESS,也就是说是不是连接正在进行中,如果是,转到步骤3,如果不是,返回错误. 用select在指定的超时时间内监听套接字的写就绪事件,如果select有监听到,证明连接成功,否则连接失败. 以下是Linux环境下的示例代码: #include <stdlib.h> #include <stdio.h>

socket连接和http连接的区别

相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过自己的浅显理解能对初学者有所帮助. 首先一定要明白: HTTP协议:简单对象访问协议,对应于应用层  ,HTTP协议是基于TCP连接的 tcp协议:    对应于传输层 ip协议:     对应于网络层  TCP/IP是传输层协议,主要解决数据如何在网络中传输:而HTTP是应用层协议,主要解决如何包装数据. Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过S

服务器-C#Socket连接,第一次要很久

问题描述 C#Socket连接,第一次要很久 各位,我写了个 Socket 程序,服务端总是开启着,客户端偶尔连接.偶尔断开.现在如果客户端断开很久后再去连服务器,第一次要很久才能连接成功.大家有没有碰到这种情况? 麻烦各位大侠多指点. 解决方案 我也遇到了这样的问题,该如何解决

Android中判断网络连接是否可用及监控网络状态_Android

获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 1)判断是否有网络连接 复制代码 代码如下: public boolean isNetworkConnected(Context context) { if (context != null) { ConnectivityManager mConn

Android编程实现基于局域网udp广播自动建立socket连接的方法_Android

本文实例讲述了Android编程实现基于局域网udp广播自动建立socket连接的方法.分享给大家供大家参考,具体如下: android开发中经常会用到socket通讯.由于项目需要,最近研究了一下这方面的知识. 需求是想通过wifi实现android移动设备和android平台的电视之间的文件传输与控制. 毫无疑问这中间一定需要用到socket来进行通信.今天就两台设备的握手连接方式分享一下吧,该方法只是本人个人想法的实现,仅供参考,如有雷同,不胜荣幸. 要想使用socket进行通讯,就必须知