问题描述
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,这样啊
解决方案:
这帖子还没结?哪个可用?