当前位置: 首页 > 编程语言 > C#

如何判断套接字断开连接Share

时间:2023-04-10 22:48:56 C#

如何判断套接字断开连接在客户端,我需要知道我的套接字连接何时/是否已被破坏。但是,Socket.Connected属性始终返回true,即使服务器端已断开连接并且我已尝试通过它发送数据。谁能帮我弄清楚这里发生了什么。我需要知道套接字何时断开连接。套接字serverSocket=null;TcpListener监听器=newTcpListener(1530);监听器.Start();listener.BeginAcceptSocket(newAsyncCallback(delegate(IAsyncResultresult){Debug.WriteLine("ACCEPTINGSOCKETCONNECTION");TcpListenercurrentListener=(TcpListener)result.AsyncState;serverSocket=currentListener.EndAcceptSocket(result);}),listener);SocketclientSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);Debug.WriteLine("clientsocketconnected:"+clientSocket.Connected);//应该是FALSE,就是clientSocket.Connect("localhost",1530);Debug.WriteLine("clientsocketconnected:"+clientSocket.Connected);//应该为TRUE,为Thread.Sleep(1000);serverSocket.Close();//在此处关闭服务器套接字Thread.Sleep(1000);clientSocket.Send(newbyte[0]);//发送数据应该导致套接字更新其连接属性。Debug.WriteLine("clientsocketconnected:"+clientSocket.Connected);//sh应该是FALSE,但它总是TRUE经过一些测试后,似乎Socket.Connected的文档是错误的,或者至少误导了clientSocket.Connected仅在clientSocket.close()之后变为false。我认为这是对原始CBerkeley套接字API及其术语的倒退。当套接字具有与之关联的本地地址时,套接字被绑定;当套接字具有与之关联的远程地址时,套接字被连接。即使远程端关闭了连接,本地套接字仍然有关联,所以它仍然是“已连接”。然而,这是一个有效的方法:!(socket.Poll(0,SelectMode.SelectRead)&&socket.Available==0)它依赖于关闭的连接被标记为可用的事实,即使没有数据可读。如果您想检测网络电缆断开连接或计算机突然关机等情况,事情会变得有点复杂。在这些情况下,您的计算机永远不会收到指示套接字已关闭的数据包。它需要通过发送数据包并注意到没有响应返回来检测远程端是否已经离开。您可以作为协议的一部分在应用程序级别执行此操作,或使用TCPKeepAlive选项。从.NET使用.NETKeepAlive并不是特别容易;您最好在协议中构建一个保持活动机制(或者,您可以问一个单独的问题“如何在.NET中启用TCP保持活动并设置保持活动间隔?”)。只需正常写入您的套接字即可。你会知道它何时被异常破坏,说你的数据无法传递。如果您没有什么可写的……那么谁在乎它是否已断开连接?它现在可能已断开连接,但在您需要它之前就回来了——为什么要费心,然后循环重新连接直到链接修复……尤其是当您无话可说时?如果它打扰你,请在你的协议中实施keepalive。然后你会每隔30秒左右说些什么。也许解决方案是通过它发送一些虚拟数据并检查它是否超时?我建议剥离高级语言并探索低级IO中发生的事情。我探索过的最低点是编写isectd(在sourceforge上找到)。通过select()系统调用,关闭的套接字的描述符就绪,并且当isectd尝试recv()时可以确认套接字的断开连接状态。作为解决方案,我建议不要编写自己的套接字IO并使用其他人的中间件。那里有很多优秀的候选人。不要忘记考虑简单的排队服务。附言。我会提供上面的所有URL,但我的声誉(1)不允许这样做。clientSocket.Send()方法是否等待数据包被确认/拒绝?如果不是您的代码飞到下一行,而套接字仍在尝试弄清楚发生了什么。以上就是C#学习教程:如何判断Socket何时断开。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: